C++中的虚拟默认析构函数

Bil*_*eal 16 c++ virtual-destructor

我有一大组继承的类(条件)继承自基类(标准).这criterion是代码

class criterion
{
public:
    virtual unsigned __int32 getPriorityClass() const = 0;
    virtual BOOL include(fileData &file) const = 0;
    virtual void reorderTree() = 0;
    virtual unsigned int directoryCheck(const std::wstring& directory) const = 0;
    virtual std::wstring debugTree() const = 0;
};
Run Code Online (Sandbox Code Playgroud)

这个派生类的一些例子:

class fastFilter : public criterion
{
public:
    void reorderTree() {};
    unsigned int  directoryCheck(const std::wstring& /*directory*/) const { return DIRECTORY_DONTCARE; };
    unsigned __int32 getPriorityClass() const { return PRIORITY_FAST_FILTER; };
};

class isArchive : public fastFilter
{
public:
    BOOL include(fileData &file) const
    {
        return file.getArchive();
    }
    std::wstring debugTree() const
    {
        return std::wstring(L"+ ISARCHIVE\n");
    };
};
Run Code Online (Sandbox Code Playgroud)

由于我根本没有析构函数,但是这应该是一个基类,我是否需要插入一个空虚拟析构函数,就像这样?:

virtual void ~criterion() = 0;
Run Code Online (Sandbox Code Playgroud)

如果需要该虚拟析构函数声明,那么所有中间类都需要一个吗?也就是说fastFilter上面还需要一个虚拟析构函数?

Mic*_*urr 42

是的 - 基类需要一个虚拟析构函数,即使它是空的.如果没有这样做,那么当某个东西delete是通过基指针/引用导出的对象时,派生对象的成员对象将无法正确地破坏自己.

派生类不需要声明或定义自己的析构函数,除非它们需要除默认析构函数行为之外的其他东西.


Fil*_*ącz 25

建议是插入

virtual ~criterion() {}
Run Code Online (Sandbox Code Playgroud)

避免删除基类指针问题.否则,您将泄漏内存,因为派生类的析构函数不会被调用.

criterion *c = new fastFilter();
delete c; // leaks
Run Code Online (Sandbox Code Playgroud)

  • @ user1095108,是不是'virtual~ criterion()= default`更漂亮? (4认同)

sth*_*sth 12

你不需要将析构函数抽象化,只需给它一个空实现:

virtual ~criterion() { }
Run Code Online (Sandbox Code Playgroud)

这样您就不会被迫在每个子类中实现它,但是它们中的每一个都将具有(继承的)虚拟析构函数.


aJ.*_*aJ. 7

与其他人已经回答的一个小变化:

代替

virtual void ~criterion() = 0;
Run Code Online (Sandbox Code Playgroud)

所需的版本是:

    virtual ~criterion() {}  //Note: Removed void as destructors not allowed 
                             //  a return type
Run Code Online (Sandbox Code Playgroud)

要了解有关虚拟析构函数的更多信息,请查看常见问题解答中的此链接.我的析构函数何时应该是虚拟的?