私有继承对try catch异常抛出的影响

 

#include
class A
{
public:
A(int i)
{
cout << “Ctor in A” << endl ;
}
virtual ~A()
{
cout << “Dtor In A” << endl ;
}
} ;

class B : private A
{
public:
B(int i) : A(i)
{
cout << “Ctor in B” << endl ;
}
~B()
{
cout << “Dtor In B” << endl ;
}
} ;
int main(int argc, char* argv[])
{
try
{
throw B(1) ;
}
catch( A& )
{
cout << “Exception caught!” << endl ;
}
return 0 ;
}

运行的情况是debug error。测试后发现将catch( A& )改为catch(…)可以成功运行。
说明B(1)无法被catch( A& )捕获。

而编译A* d= new B(4);g++报error: ‘A’ is an inaccessible base of ‘B’。
throw B不能转换成A。所以catch不执行,栈上找不到更深的catch。
最后__cxa_throw() 调用了std::terminate ();引起了abort().

posted on 2009-07-02 17:40  酷享Qt  阅读(341)  评论(0)    收藏  举报