仮想関数を作成すると、そのクラスのオブジェクトに vtable が追加されます。仮想デストラクタにも当てはまりますか?デストラクタの仮想性を実装するために使用される vtable
2092 次
6 に答える
5
はい。オブジェクトが基本クラス ポインターを介して削除されたときに、適切なデストラクタを呼び出せるようにするには、いくつかの情報が必要です。その情報が小さな整数インデックスであるかポインターであるかは問題ではありません (ただし、動的リンケージはおそらくそれがポインターであることを意味します)。当然、その情報は、ポイント先のオブジェクトに隣接 (内部) する必要があります。
デストラクタを含むあらゆる種類の仮想メソッドを、それまで存在しなかったクラスに追加すると、sizeof(class) が増加します。
于 2009-09-17T03:50:41.247 に答える
4
C++ 標準が正しい動作を生成するために特定のメカニズムを必要とするとは思いませんが、それは典型的な実装です。少なくとも 1 つの仮想関数を持つクラスには、(仮想) 関数ポインターのテーブルがあり、仮想としてマークされている場合、デストラクタはそれらの 1 つです。
于 2009-09-17T03:46:21.980 に答える
2
はい、そうです。申し訳ありませんが、私の主張を裏付ける決定的な参照はありません。しかし、オブジェクトへのポインタだけを使用する場合、どのように異なる動作を得るでしょうか?
于 2009-09-17T03:45:48.603 に答える
2
はい。仮想デストラクタは、他の仮想メソッドと同様です。Vtable エントリが追加されます。
于 2009-09-17T03:47:19.047 に答える
0
これは他の通常の関数と同様に扱われ、vtable に追加されます。
于 2009-09-17T03:57:19.057 に答える
0
于 2009-09-17T03:59:41.470 に答える