基本クラス(基準)から継承された多数の継承クラス(基準)があります。これが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
基本ポインタ/参照を介して派生オブジェクトになったときに、派生オブジェクトのメンバー オブジェクトは適切に自分自身を破棄する機会が得られません。
派生クラスでは、デフォルトのデストラクタの動作以外のものが必要でない限り、独自のデストラクタを宣言または定義する必要はありません。