在这种情况下,我是否仍需要为派生类设置虚拟析构函数?

Jus*_*ang 0 c++ virtual-destructor

我一直在阅读Scott Meyers的Effective C++ 3rd Edition,在其中一章中他说任何具有虚函数的类几乎都应该有一个虚拟的析构函数.现在,对于我下面的代码,该函数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?

}
Run Code Online (Sandbox Code Playgroud)

Lig*_*ica 6

它已经是!

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

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


Ded*_*tor 5

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

但是,不,你不需要使用virtual它,也不需要声明它:
虚拟的基类版本会自动使派生的虚拟版本而不必做任何事情.