Alo*_*lok 11 c++ polymorphism dynamic-memory-allocation virtual-destructor
#include <iostream>
using namespace std;
class base
{
int a;
public:
base() {a =0;}
};
class derv :public base
{
int b;
public:
derv() {b =1;}
};
int main()
{
base *pb = new derv();
delete pb;
}
Run Code Online (Sandbox Code Playgroud)
我在derv类中没有虚拟析构函数,它只删除了derv对象的基本部分吗?
Jam*_*lis 21
它可能.
因为base没有虚拟析构函数,所以您的代码会显示未定义的行为.什么都可能发生.它可能看起来像你期望的那样工作.它可能泄漏内存.它可能会导致您的程序崩溃.它可能会格式化您的硬盘.
要求引用.C++11§5.3.5/ 3指出,对于标量delete表达式(即,不是delete[]表达式):
如果要删除的对象的静态类型与其动态类型不同,则静态类型应为要删除的对象的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义.
静态类型(base)与动态类型(derv)不同,静态类型没有虚拟析构函数,因此行为未定义.