C++仕様の私の(限られた)知識によれば、仮想メンバを持つクラスのvtableは、最初の非純粋な非インライン仮想メソッドの定義に置かれます。コンパイラは、すべての純粋仮想メソッド(例えば、インタフェース)を持つクラスから継承するクラスをどのように処理するのですか?この場合、vtableはどこに配置されていますか?完全に純粋な仮想クラスのVtableの配置
答えて
vtableには、実装された仮想メソッドのアドレスが格納されます。クラスのすべてのメソッドが純粋仮想であり、どれも実装されていない場合は、vtableを生成する必要はありません。
クラスから派生してメソッドを実装することなく、そのようなクラスをあまり使用することはできませんでした。実装された仮想メソッドを持つ各クラスには、すべての仮想メソッドのアドレスを含む独自のvtableがあります。基本クラスのvtableは決して参照しません。アドレスは複製されます。したがって、別のクラスから継承するクラスがある場合、そのクラスは独自のvtableだけを使用します。基本クラスのvtableは気にしません。このvtableは存在する必要もありません。
C++仕様自体はvtableについて何も言及していません。それらは単に一般的になっているコンパイラの動作です。
私の限られた知識によれば、インスタンスがあるまではvtableは必要ありません。
どのようなインスタンスですか?純粋仮想関数が別のTUで定義された実装を持つかどうかを問わず、コンパイラは単一のTUをコンパイルする際には分かりません。コンパイラの実装者は、どのように対処するかを決めることができ、未定義の純粋仮想関数への不正な呼び出しを報告するためにvtableを作成し、エラー関数へのポインタを設定することは合理的な解決策になります。 –
C++標準では、vtableの配置、またはvテーブルの存在については何も指定していません。それは振る舞いを指定するだけであり、v表は最も直接的な実装であるため、広く使用されています。
抽象クラスのvテーブルが存在する理由の1つは、オブジェクトの動的な型が抽象クラスである場合に、構築および破棄中に使用されるためです。
純粋な仮想関数のみを持つクラスでは、コンストラクタが存在しない可能性があります(コンストラクタは仮想にできないため)。しかし、デストラクタは確かに仮想である可能性があります。
クラスに実装済みのpure virtual destructorがまだ存在していて、次にvテーブル(または同等の実装の詳細)が必要です。
しかし、純粋仮想関数の実装はまれであり、インタフェースを定義するときには実行されません。
- 1. 純粋仮想クラス、1つの派生クラス、まだvtable?
- 2. 純粋仮想と仮想の違い
- 3. 純粋仮想デストラクタ
- 4. 純粋仮想メソッドと仮想メソッドを混在させたクラス
- 5. 純粋に仮想クラスの派生クラスのフレンドステータス
- 6. 純粋な仮想関数のないC++抽象クラス?
- 7. 純粋仮想デストラクタは
- 8. デフォルト純粋仮想デストラクタ
- 9. C++ map.clear()純粋仮想メソッドランタイムエラー
- 10. 純粋な仮想メソッドを使用したC++クラスのクローニング
- 11. 純粋仮想関数のオーバーロード
- 12. SWIG JAVA%のインターフェースと、純粋仮想メソッド
- 13. 純粋仮想関数のエラー
- 14. 仮想の有無にかかわらず純粋な仮想メソッドの実装?
- 15. 純粋仮想関数でC++クラスを使用するには?
- 16. 完全な位置決め、純粋なCSSソリューションが必要
- 17. C++複数テンプレート純粋仮想継承
- 18. Enterprise Architect純粋仮想関数 "= 0"
- 19. 純粋な仮想メンバをベースにしたキャスト派生仮想オーバーライド
- 20. 純粋仮想関数は、ベース/派生クラス
- 21. テンプレートベースの派生クラスを持つ基本クラスの純粋仮想関数
- 22. 派生クラスの純粋仮想関数を他の純粋仮想関数として実装するにはどうすればよいですか?
- 23. 実装されていない純粋な仮想メソッド
- 24. 仮想コンストラクタイディオム - 虚偽または完全な完全フォールシス
- 25. C++:不可解な「純粋仮想関数呼び出し」エラー
- 26. 純粋な仮想関数呼び出し
- 27. "純粋な仮想メソッド"を解決する方法
- 28. 保護されたコンストラクタと純粋な仮想デストラクタ
- 29. C++:非仮想関数で純粋仮想関数を使用する
- 30. QThreadPoolは親クラスQRunnableの純粋仮想関数を呼び出します
C++の仕様自体にはvtablesのことは何も言われていません。 –
重い実装の詳細。 MSVC++には、このようなvtableを抑制する__declspec(novtable)があります。同じことをするための非標準の__interfaceキーワード。 –