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

标签 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;
};

这个派生类的一些例子:

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");
    };
};

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

virtual void ~criterion() = 0;

如果需要虚拟析构函数声明,是否所有中间类也都需要一个? IE。上面的 fastFilter 是否也需要一个虚拟析构函数?

最佳答案

是的 - 基类需要一个虚拟析构函数,即使它是空的。如果不这样做,那么当通过基指针/引用delete是派生对象时,派生对象的成员对象将没有机会正确地销毁自己。

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

关于c++ - C++ 中的虚拟默认析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/827196/

相关文章:

c++ - 是否有用于 C++ 的 Open XML 解析器?

c++ - 继承层次结构中的析构函数顺序

c++ - 如果未使用 shared_ptr 定义虚拟析构函数,是否有任何优势

c++ - 我需要一个用于 boost::ublas 矩阵的虚拟析构函数吗?

qt - QMainWindow 析构函数

c++ - 如何在 C++ 中创建不可删除的注册表项(或文件)

c++ - boost 交叉口不起作用

c++ - 非虚拟析构函数c++的异常

c++ - 不使用 boost 绑定(bind)

c++ - ia 是数组时无法推断出 "auto ia2(ia)"