仮想関数を書くと、そのクラスのオブジェクトにvtableが追加されます。仮想デストラクタにも当てはまりますか? vtableはデストラクタの仮想性を実装するために使用されます仮想デストラクタとVtableとの間には何らかの関係がありますか
0
A
答えて
4
はい。オブジェクトが基本クラスポインタを介して削除されたときに、適切なデストラクタが呼び出されるようにするには、いくつかの情報が必要です。その情報が小さな整数インデックスかポインタかは関係ありません(ただし、動的リンケージはおそらくポインタであることを意味します)。当然のことながら、その情報は、指し示されたオブジェクトに隣接している(内側に)必要があります。
前に何を持っていないクラスに、デストラクタを含む、あらゆる種類の仮想メソッドを追加はsizeof(クラス)を増加させるであろう。
2
はいです。申し訳ありませんが私の主張をバックアップするための決定的な参照を持っていない。しかし、オブジェクトへのポインタだけを使用すると、どのように違う振る舞いになるでしょうか?
4
私は、C++標準が正しい振る舞いを生み出すための特定のメカニズムを必要としているとは思っていませんが、それは典型的な実装です。少なくとも1つの仮想関数を持つクラスは、(仮想)関数ポインタのテーブルを持っています。デストラクタは、virtualとマークされている場合、それらのうちの1つです。
2
はい。仮想デストラクタは他の仮想メソッドと似ています。 Vtableエントリが追加されます。
0
これは、任意の他の通常の関数と同じように扱われ、仮想テーブルに追加されます。
0
仮想メソッドを実装する他のメカニズムがあります。 vtablesは最も一般的な(実装が容易な)ものです。 –