2015-03-30 53 views
0

我一直在阅读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? 

} 
+2

析构函数已经虚。你可以添加一个'virtual'关键字来提高可读性,但它不会改变代码的语义。我正在寻找一个很好的副本。 – juanchopanza 2015-03-30 19:32:35

+0

N.B.虚拟函数和你编写'virtual'关键字是有区别的。我想你在这里有一个误解。希望我的回答能澄清一点。 – 2015-03-30 19:35:19

+1

只要函数(析构函数)被标记为虚拟,它就会在所有派生类中保持虚拟。重复的'虚拟'在C++ 11之前是一个很好的提示。现在你应该在覆盖一个虚函数时使用覆盖。 – 2015-03-30 19:45:39

回答

6

它已经是!

virtual关键字是隐式的为你derived::someFunc,对你derived::~derived,因为两种功能碱当量标记virtual

所以,你可能会写上这两个关键字virtual,没有或只有一个。这并不重要:无论如何,它们都将实际上是虚拟的。

5

是的,你仍然需要一个虚拟析构函数来派生类。

但是,没有,你不需要使用就可以了virtual,也不是在所有它声明:
基类的版本是虚拟自动将衍生一个虚拟无需你做任何事情。

0

每当有就是当你删除分配的内存,它会自动调用儿童类析构函数父析构函数之前,虚拟的,你不必把儿童的析构函数是虚拟的。

相关问题