在这种情况下,我的派生 class 还需要一个虚拟析构函数吗?

Do I still need to have a virtual destructor for my derived class in this situation?

我一直在阅读 Scott Meyers 的《Effective C++》第 3 版,在其中一章中他说任何 class 带有虚函数的东西几乎都应该有一个虚析构函数。现在对于我下面的代码,函数 someFunc 不需要派生的 class 中的虚函数。但是,我决定将它放在那里以显示语义并提高可读性。既然我把 virtual 放在那里,是否意味着派生的 class 中的析构函数必须是 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 关键字对于您的 derived::someFuncderived::~derived 是隐含的,因为这两个函数的基本等效项都标记为 virtual.

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

,你仍然需要一个用于派生 class.

的虚拟析构函数

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

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