【发布时间】:2015-03-30 19:31:25
【问题描述】:
我一直在阅读 Scott Meyers 的《Effective C++ 3rd Edition》,在其中一章中他说任何具有虚函数的类几乎肯定都应该有一个虚析构函数。现在对于我下面的代码,函数someFunc 在派生类中不需要虚拟。然而,我决定把它放在那里以显示语义和更好的可读性。既然我把virtual放在那里,那是不是说派生类中的析构函数必须是virtual呢?
#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关键字以提高可读性,但它不会改变代码的语义。我正在寻找一个好的副本。 -
注:虚拟函数与您编写
virtual关键字之间存在差异。我想你在这里有一个误解。希望我的回答能澄清一点。 -
一旦函数(析构函数)被标记为虚拟,它在所有派生类中都保持虚拟。在 C++ 11 之前,'virtual' 的重复是一个很好的提示。现在你应该在重写虚函数时使用 override。