下面的代码应该做什么以及解释

nsi*_*akr -1 c++

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东西,并留下空构造函数.