少し関連する質問が 1 つあります。しかし、話題はまったく異なります。
さて、1 つの概念は関数の解決に関するもので、別の概念はclass
解決に関するものですか? vtable
彼らが同じものを使用している場合(少なくとも gcc-4.5 で) 、どうすれば可能なのでしょうか?これはコンパイラに依存する用語ですか?
それが基本的なばかげた質問に見えるかもしれないことは知っていますが、私はそれを考えたことはありませんでした.
少し関連する質問が 1 つあります。しかし、話題はまったく異なります。
さて、1 つの概念は関数の解決に関するもので、別の概念はclass
解決に関するものですか? vtable
彼らが同じものを使用している場合(少なくとも gcc-4.5 で) 、どうすれば可能なのでしょうか?これはコンパイラに依存する用語ですか?
それが基本的なばかげた質問に見えるかもしれないことは知っていますが、私はそれを考えたことはありませんでした.
この種の良いリファレンスは Itanium ABI です - 例えばhttp://mentorembedded.github.com/cxx-abi/abi.html#vtableを参照してください。名前にもかかわらず、広く使用されている C++ 用の ABI であり、適切に機能する実装について説明しています (ただし、明らかに他の実装も可能です)。
オブジェクトへのポインタだけが与えられたオブジェクトの動的タイプがわかっている場合は、両方の問題(仮想関数呼び出しと仮想継承)を解決できます。C ++のすべての(ポリモーフィック)オブジェクトには、正確に1つの動的型があります。これは、構築された時点で決定されます。たとえば、を書くとき、あなたがただを保存したとしてもnew Foo
、そのオブジェクトは動的タイプを持っています。Foo
void*
Avtable
は、オブジェクトの動的タイプに関する情報を、ベースポインタを介して取得できるように格納するメカニズムです。std::type_info
関数ポインタ、キャストオフセット、オブジェクトなど、かなりの数のものをvtableに格納できます。