基类含虚析构函数时,子类用默认析构的多态删除是否安全?
问题解答:通过基类指针删除无显式析构的派生类对象是否安全?
答案是完全安全,而且会严格按照正确的顺序执行析构函数——如果aptr指向的是C类对象,析构顺序会是:先调用C的默认析构函数,接着是B的默认析构,最后是A的虚析构函数。
核心原因:虚析构函数的继承特性
基类A的析构函数被声明为virtual,这是关键。根据C++标准,只要基类的析构函数是虚函数,那么所有派生类的析构函数(不管是显式定义的还是编译器自动生成的默认析构)都会自动成为虚函数。
对你的代码来说:
- 编译器会为
B、C、D自动生成默认析构函数,这些析构函数会继承A的虚属性。 - 当执行
delete aptr时,虚函数机制会根据aptr实际指向的对象类型(比如C),调用对应的析构函数。
析构顺序的细节
当C的默认析构函数被调用时:
- 首先执行C类自身的析构逻辑(虽然你没写,但编译器生成的默认析构会处理成员变量的销毁);
- 然后自动调用直接基类B的默认析构函数;
- B的析构函数执行完毕后,再调用基类A的虚析构函数。
整个过程完全符合C++中派生类对象销毁时“先派生、后基类”的析构顺序,不会出现内存泄漏或未定义行为。
补充说明
如果基类A没有将析构函数声明为virtual,那么通过A*指针删除派生类对象才是未定义行为——但你的代码里已经正确使用了虚析构,所以完全不用担心这个问题。
内容的提问来源于stack exchange,提问作者kdog
相关产品推荐
相关产品推荐

