我一直在阅读Scott Meyers的Effective C ++ 3rd Edition,在其中一章中他说任何具有虚函数的类几乎都应该有一个虚拟的析构函数。现在,对于下面的代码,函数someFunc
在派生类中不需要虚拟。但是,我决定把它放在那里以显示语义和更好的可读性。由于我将虚拟放在那里,是否意味着派生类中的析构函数必须是虚拟的?
#include <iostream>
using namespace std;
class base
{
public:
base(){...}
virtual ~base(){...}
virtual someFunc() = 0;
};
class derived1:public base
{
public:
derived1(){...}
~derived1(){...} //Does this need to be virtual?
virtual someFunc(/*Implement the function*/); //I made this virtual just to show meaning
};
int main()
{
base* b;
b=new derived1;
delete b; //Will this cause a memory leak?
}
答案 0 :(得分:6)
已经是!
virtual
关键字隐含在derived::someFunc
和derived::~derived
,因为这两个函数的基本对等关系都标记为virtual
。
因此,您可以在两者上写两个关键字virtual
,也可以只编写一个关键字{{1}}。没关系:无论如何,它们都是虚拟的。
答案 1 :(得分:5)
是,您仍需要派生类的虚拟析构函数。
但没有,您不需要在其上使用virtual
,也不需要声明它:
虚拟的基类版本会自动使派生的虚拟版本无需您执行任何操作。
答案 2 :(得分:0)
每当在父析构函数之前虚拟化时,它会在删除已分配的内存时自动调用子类中的析构函数,您不必将虚拟内容放入子函数的析构函数中