为什么异常处理中派生类到基类的隐式转换可行?
异常处理中的隐式转换误区与多态类验证
我之前一直笃定,在C++异常处理流程里,float到int、char到int这类隐式数值转换是不会触发的。结果最近面试时,我用这个逻辑去回答多态类相关的异常捕获问题,直接被面试官指出了错误。
为了验证这个问题,我写了一段测试代码:
#include<iostream> using namespace std; class base { public: virtual void what() { cout<<"caught in base"<<endl; } }; class derived : public base { public: void what() { cout<<"caught in derived"<<endl; } };
(注:代码片段未完整展示后续的异常抛出与捕获逻辑,但核心是围绕多态基类/派生类的异常匹配,以及是否存在隐式转换的问题)
这里的关键误区在于:数值类型的隐式转换规则和类层次的异常匹配规则是完全不同的。对于数值类型的异常,编译器确实不会自动做隐式转换来匹配catch块;但对于继承体系中的类异常,当抛出派生类对象时,catch基类类型的语句是可以匹配的——这不是隐式转换,而是多态体系下的向上转型匹配,属于C++异常处理的标准规则。
比如如果后续代码中抛出derived类型的异常,catch(base&)是可以成功捕获的,这和数值类型的隐式转换完全是两回事,我之前把这两个规则混淆了,才导致面试回答出错。
内容的提问来源于stack exchange,提问作者Swapnil
相关产品推荐
相关产品推荐

