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是的析构函数?
通过指向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)
正常工作。
| 归档时间: |
|
| 查看次数: |
488 次 |
| 最近记录: |