仮想デストラクタとVtableの間に関係はありますか
質問
仮想関数を記述すると、そのクラスのオブジェクトにvtableが追加されます。仮想デストラクタにも当てはまりますか?デストラクタの仮想性を実装するためにvtableが使用されています
解決
はい。オブジェクトが基本クラスポインターを介して削除されたときに正しいデストラクタが呼び出されるようにするには、いくつかの情報が必要です。その情報が小さな整数インデックスであるかポインターであるかは問題ではありません(ただし、動的なリンケージはおそらくそれがポインターであることを意味します)。当然、その情報は、ポイント先のオブジェクトに隣接する(内側にある)必要があります。
以前に何もなかったクラスに、デストラクタを含むあらゆる種類の仮想メソッドを追加すると、sizeof(class)が増加します。
他のヒント
C ++標準では、正しい動作を生成するための特定のメカニズムが必要とは考えていませんが、はい、それは典型的な実装です。少なくとも1つの仮想関数を持つクラスには、(仮想)関数ポインターのテーブルがあり、仮想のマークが付けられている場合、デストラクタはそれらの1つです。
はい。申し訳ありませんが、私の主張を裏付ける明確な参考資料はありません。しかし、オブジェクトへのポインターだけを使用する場合、他にどのように異なる動作を得るでしょうか?
はい。仮想デストラクタは、他の仮想メソッドと同様です。 Vtableエントリが追加されます。
他の通常の関数と同様に扱われ、vtableに追加されます。
所属していません StackOverflow