【问题标题】:Do I still need to have a virtual destructor for my derived class in this situation?在这种情况下,我还需要为派生类创建一个虚拟析构函数吗?
【发布时间】: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。

标签: c++ virtual-destructor


【解决方案1】:

已经是了!

virtual 关键字对于您的 derived::someFunc 和您的 derived::~derived 是隐含的,因为这两个函数的基本等效项都标记为 virtual

因此,您可以在两者上都写上关键字virtual,既不写也可以只写一个。没关系:无论如何,它们实际上都是虚拟的。

【讨论】:

    【解决方案2】:

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

    但是没有,你不需要在上面使用virtual,也不需要声明:
    基类版本是虚拟的会自动使派生的版本成为虚拟版本,而无需您做任何事情。

    【讨论】:

      【解决方案3】:

      只要在父析构函数之前有一个 virtual ,当您删除分配的内存时,它会自动调用子类中的析构函数,您不必将 virtual 放入子类的析构函数中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-01
        • 1970-01-01
        • 2011-08-02
        • 1970-01-01
        相关资源
        最近更新 更多