【发布时间】:2011-11-12 02:53:51
【问题描述】:
class A
{
public:
virtual void f(){ printf("A.f "); }
~A(){ f(); }
};
class B : public A
{
A a;
public:
void f(){ printf("B.f "); }
B(){ throw -1; }
~B(){ f(); }
};
int main()
{
try{ B b; }
catch(...){ printf("Exc");}
}
这就是我的看法。在 try 块内,构造 B b; 时没有打印任何内容。块结束。我认为编译器首先破坏了A a; 成员。所以A.f() 会被打印出来。这是否意味着class B 实例的销毁已经完成?之后,编译器会简单地调用~A()(破坏基类)吗?
我想我应该得到A.f(),然后是B.f()(破坏B类实例),然后又是A.f()(基类的析构函数)。编译这个让我思考了一下。
Exc 将在课程结束时打印。
我已经浏览了几个主题,但没有找到任何东西。
编辑:Dev-C++ (GCC 3.4.2) 的输出是
A.f A.f Exc
【问题讨论】:
-
如果你的输出不是你预期的那样有问题,你需要发布你得到的实际输出。
-
我得到:
A.f A.f Exc(gcc 4.4) -
我将把它留在这里:dev-c++.
-
@R.: Dev-C++ 的相关性是什么?
-
@Tomalak:问题中提到了。
标签: c++ exception inheritance destructor