class A {
public:
A() { }
~A() { cout << "A Destructor \n" ; }
};
class B :public A{
public:
B() { }
virtual ~B() { cout << "B Destructor \n" ; }
};
class C : public B {
public:
C() { }
~C() { cout << "C Destructor \n"; }
};
int main()
{
A *pointA = new A;
A *pointB = new B;
A *pointC = new C;
delete pointA;
delete pointB;
delete pointC;
}
Run Code Online (Sandbox Code Playgroud)
GMa*_*ckG 10
它将在第二次(和第三次)删除时调用未定义的行为,因为A的析构函数不是虚拟的.
§5.3.5/ 3:
如果操作数的静态类型与其动态类型不同,则静态类型应为操作数的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义.
如果你创建了一个虚拟的析构函数,你会得到明确定义的行为,并且会调用动态类型的析构函数.(并且每个人又调用基础析构函数.)您的输出将是:
析构函数
B析
构
函数
析
构函数C析构函数B析构函数析构函数
对于它的价值,当你接近可编辑的片段时,你应该离开包含.另外,只需使用struct而不是class简洁的public东西,并留下空构造函数.
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |