具有虚拟析构函数的基类的子类中的默认析构函数

kdo*_*dog 3 c++ virtual-destructor

我有一个A带有虚拟析构函数的基类。A具有后代B,C并且使用默认析构函数。C通过指针删除的对象是否安全A?

更具体地说,请考虑以下示例代码:

class A {
 public:
      A(){};
      virtual ~A() {/* code here */};
 };
 class B: public A {
      B() {/* code....*/};
      /* NO DESTRUCTOR SPECIFIED */
   };
 class C: public B {/*same as above, no destructor */};
 class D: public B {/* same as above, no destructor*/}
Run Code Online (Sandbox Code Playgroud)

要运行的代码如下所示:

A* getAPointer(void); /* a function returning a C or a D*/
A* aptr=getAPointer();
/* aptr is declared as A*, but points to either an object of class C 
  or class D*/
delete aptr;
Run Code Online (Sandbox Code Playgroud)

是delete aptr安全的吗?这样做是否正确:如果aptr指向class的对象C,则aptr首先调用C的析构函数,然后B是的析构函数,最后A是的析构函数?

Edg*_*jān 5

通过指向A的指针删除C的对象是否安全?

是的,这是因为在课堂上所有的析构函数完全安全的B,C并D会隐式虚拟。

从:

15.4析构函数[class.dtor]

10可以将析构函数声明为虚拟(13.3)或纯虚拟(13.4);如果在程序中创建了该类的任何对象或任何派生类,则应定义析构函数。如果一个类具有带有虚拟析构函数的基类,则其析构函数(无论是用户声明的还是隐式声明的)都是虚拟的。

作为A具有虚拟析构函数,然后B,和C,D分别具有虚拟析构函数,并且:

delete aptr;
Run Code Online (Sandbox Code Playgroud)

正常工作。