向上引用时new创建的对象的析构

假设Employee是基类,Singer是派生类,并添加一个char*成员,该成员指向有new分配的内存。

下面的代码:

Employee *pe = new Singer;
delete pe;

如果使用默认的静态编译,delete语句将调用~Employee()析构函数。这将释放由Singer对象中的Employee部分指向的内存,但不会释放新的类成员指向的内存。

但如果析构函数是虚的,则上述代码将先调用~Singer析构函数释放由Singer组件指向的内存,然后调用~Employee()析构函数来释放由Employee组件指向的内存。

这意味着,即使基类不需要显示析构函数提供服务,也不应依赖于默认构造函数,而应提供虚析构函数,即使它不执行任何操作:

virtual ~BaseClass(){}

顺便说一句,给类定义一个虚析构函数并非错误,即使这个类不作基类;这只是一个效率方面的问题。

提示:通常应该给基类提供一个虚析构函数,即使它并不需要析构函数。可以为以后拓展类组合继承打下基础。

猜你喜欢

转载自blog.csdn.net/weixin_40539125/article/details/84061515