当我编写try/catch
块时,我总是按值抛出对象并通过引用捕获。我还应用了大多数派生类必须首先出现的规则。
今天我试图捕捉违反这条主要规则的BY VALUE。下面的代码执行没有任何问题,并打印"A4"
。
问题:将哪种类型的CCA
参数传递给执行的异常处理程序?抛出的原始对象是CCB
通过值传递给CCA
对象:这是内存切片问题或某些损坏的例子,即对象CCA
不能完全信任吗?
此致
AFG
class CCA{
int m_value;
public:
CCA( int value ) : m_value( value ){}
};
class CCB : public CCA{
public:
CCB( int value ): CCA( value ){}
};
main(){
try{
throw CCB(4);
}catch( CCA a ){
std::cout << " A:" << a.value() << std::endl;
// this is the catch clause that executes
}catch( CCB b ){
std::cout << " B:" << b.value() << std::endl;
}
}
答案 0 :(得分:3)
这是切片:基本拷贝构造函数无法区分真正相同类型的参数与派生类类型的参数:
struct Base {
Base(Base const &); // must accept any derived class
};
答案 1 :(得分:1)
始终按顺序选择Catch block for exception,然后在代码中显示。因此,如果您按照程序的异常顺序颠倒了B:4
在你的代码中,第一个catch子句被选中,基类的copy-constructor传递了原始的copy实例,但是它将是一个真正的基类实例。
通常以最接近的顺序提供捕获块并通过引用传递参数的解决方案。