我一直在阅读C++有效第三版斯科特迈尔斯,并在其中一章,他说,有虚函数的任何类几乎应该有一个虚析构函数。现在,下面我的代码,功能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?
}
析构函数已经虚。你可以添加一个'virtual'关键字来提高可读性,但它不会改变代码的语义。我正在寻找一个很好的副本。 – juanchopanza 2015-03-30 19:32:35
N.B.虚拟函数和你编写'virtual'关键字是有区别的。我想你在这里有一个误解。希望我的回答能澄清一点。 – 2015-03-30 19:35:19
只要函数(析构函数)被标记为虚拟,它就会在所有派生类中保持虚拟。重复的'虚拟'在C++ 11之前是一个很好的提示。现在你应该在覆盖一个虚函数时使用覆盖。 – 2015-03-30 19:45:39