C++ の仮想デフォルトデストラクタ 質問する

C++ の仮想デフォルトデストラクタ 質問する

基本クラス(基準)から継承された多数の継承クラス(基準)があります。これが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;

その仮想デストラクタ宣言が必要な場合、すべての中間クラスにも必要ですか? つまり、上記の fastFilter にも仮想デストラクタが必要ですか?

ベストアンサー1

はい、基本クラスには、たとえ空であっても仮想デストラクタが必要です。これが行われないと、delete基本ポインタ/参照を介して派生オブジェクトになったときに、派生オブジェクトのメンバー オブジェクトは適切に自分自身を破棄する機会が得られません。

派生クラスでは、デフォルトのデストラクタの動作以外のものが必要でない限り、独自のデストラクタを宣言または定義する必要はありません。

おすすめ記事