1. ホーム
  2. c++

[解決済み] なぜC++では純粋仮想デストラクタが必要なのでしょうか?

2022-04-23 01:15:50

質問

仮想デストラクタの必要性は理解しています。しかし、なぜ 純粋 仮想デストラクタ?あるC++の記事で、著者はクラスを抽象化したいときにpure virtual destructorを使うと述べています。

しかし、メンバー関数のいずれかを pure virtual にすることで、クラスを抽象化することができます。

そこで質問なのですが

  1. デストラクタを本当に純粋な仮想にするのはいつですか?誰かいい実例を教えてください。

  2. 抽象クラスを作成するとき、デストラクタも純粋仮想にすることは良い習慣ですか?もしそうなら、なぜですか?

解決方法は?

  1. おそらく、純粋仮想デストラクタが許可されている本当の理由は、それを禁止すると言語に別のルールを追加することになり、純粋仮想デストラクタを許可しても何の悪影響もないため、このルールは必要ないためでしょう。

  2. いや、普通のバーチャルで十分だ。

オブジェクトを作成し、その仮想メソッドにデフォルトの実装を施した上で、誰にもオーバーライドを強要せずに抽象化したい場合 特定 メソッドを使用すれば、デストラクタを純粋仮想化することができます。あまり意味があるとは思えませんが、可能性はあります。

コンパイラは派生クラスに対して暗黙のデストラクタを生成するので、クラスの作者がそうしない場合、すべての派生クラスがそうなることに注意してください。 ない 抽象的である。したがって、純粋仮想デストラクタを基底クラスに持っていても、派生クラスには何の影響もありません。基底クラスが抽象化されるだけです。 カッパ のコメント)。

また、すべての派生クラスが特定のクリーンアップコードを持つ必要があり、それを書くためのリマインダーとして純粋な仮想デストラクタを使用すると仮定することもできますが、これは作為的(および強制されない)なように思えます。

注意 デストラクタは、たとえそれが 純粋仮想 があります。 は、派生クラスをインスタンス化するために実装を持つ必要があります(はい、純粋な仮想関数は実装を持つことができます)。

struct foo {
    virtual void bar() = 0;
};

void foo::bar() { /* default implementation */ }

class foof : public foo {
    void bar() { foo::bar(); } // have to explicitly call default implementation.
};