これが私が入っているボックスです。「インターフェイスクラス内に仮想デストラクタを配置する」ことが重要である理由を理解したいと思います。最後までがんばれば、引用符で囲まれている理由がわかります... また、すべての語彙を完全に正しいものにしたいと考えています。これまでのプロセスで私がいる場所は次のとおりです。
基本クラスがある場合もあれば、基本クラスから継承する派生クラスがある場合もあります。
派生オブジェクトを指しているベースポインターがあり、さらに派生オブジェクトを指すそのベースポインターから行われたメンバー関数呼び出しを、実際に呼び出されたかのように動作させたい場合派生オブジェクトから、呼び出すメンバー関数は、基本クラスで仮想として宣言する方がよいでしょう。
インターフェイスは、純粋仮想関数のみを持つ任意のクラスです。このインターフェイス クラスから新しいクラスを派生させ、すべての純粋仮想関数を実装すると、最終的に派生クラスのインスタンスを作成できます。
インターフェイス クラスのインスタンスを持つことはできませんが、インターフェイス クラスへのポインターのインスタンスを持つことはできます。
派生クラスのオブジェクトを実際に指すインターフェイス クラスへのポインターがある場合 (実際には、#4 が正しい場合は常にそうする必要があると思います)、およびそのオブジェクトを削除することにした場合あなたのポインタ、そして「インターフェースクラス内に仮想デストラクタ」がない場合、派生オブジェクトを破壊する意図は、ベースオブジェクト(つまりインターフェースクラス)を破壊するための呼び出しとしてのみ実行されます。仮想デストラクタでは、派生オブジェクトのデストラクタが実際に呼び出されるポイントに到達することはなく、メモリ リークが発生します。
ふぅ。わかりました、それが正しければ、私の質問に移ります。次のように、インターフェイス内で仮想デストラクタを宣言するだけで十分ですか。
virtual ~iFace();
それは私には間違っているように見えます...だから、次のようにデストラクタを純粋仮想にするとどうなりますか:
virtual ~iFace() = 0;
それらは単なる宣言であるため、これらのいずれかが「インターフェイス クラス内の仮想デストラクタ」としてカウントされますか? 宣言されているが定義されていないデストラクタを使用できますか? それが純粋な仮想である場合にのみ、私は推測します...
とにかく、タイトルの質問に戻ります...私は本当にできる限り速く進んでいます...これがお金のショットです...「インターフェースクラス内の仮想デストラクタ」が少なくともこのような空の定義を必要とする場合:
virtual ~iFace() {};
次に、そのメンバー関数は純粋仮想ではありません (定義を指定したため、そうではありません)。したがって、クラスはインターフェイスではなくなります (純粋仮想メンバー関数だけが含まれているわけではありません)。
これは、インターフェイスの仮想デストラクタを定義すると、インターフェイスがなくなることを意味します (ただし、いくつかの抽象基本クラスのみ)。これはただの言葉遣いですか?何が起こっているのか理解できますか?
注: これはすべて、「インターフェースとは何か?」という自問自答から生まれました。次に、この質問の回答を読んでください: C++ でインターフェイスを宣言するにはどうすればよいですか?
短すぎるライドでは長すぎないことを願っていますが、これらの概念とそれに関連する語彙を完全に理解することを決意しています.