2012-09-07 16 views
6
  1. 仮想継承はvTableを使用しますか?はい、いいえの場合は、どのように実装したのですか?
  2. 仮想継承はどのようにメモリ内で動作しますか?
  3. 仮想継承

ための任意の他の代替は本当に概念的な説明に感謝しています。仮想継承はどのように機能しますか?

+0

実装が定義されています。 – ildjarn

+0

実装依存であり、厳密な専門用語では*未指定*、C++標準は仮想継承が提供しなければならない動作のみを記述しますが、実装方法を指定していません。この詳細を指定する必要はありません。コンパイラの大部分(*すべての既知の*を読んでください)が仮想テーブルとポインタのメカニズムを使用していると言います。 –

+1

上記のことを言えば、Qは無関係なものではなく、まったく実際のQではないと思わないでください。すべてのコンパイラは同様のメカニズムを使用しますが、実装の詳細を知る必要はありませんが、それを知ることはありません。また、このQは、誰かが時間をかけて説得力のある答えを出してくれれば、何度もC++ファクトを作ることができます。 –

答えて

1

仮想継承は、コンパイラによって異なる方法で実装されます。

1)はい、vcとgccの両方がvTableポインタを使用します。しかし、vcは仮想ベースポインタとして別のポインタrefを持っています。

2)古典的な仮想継承の場合は、左のように<のようになります。右<トップ;ボトム<左と右 は、スタックは次のようにする必要があります:

Left.vptr // -> to its vtable 

Left::element_in_left 

Right.vptr 

Right::element_in_right 

Bottom::element_in_bottom 

Top::element_in_top 

プログラムはvtableのを見つけるためにvptrを使用し、gccのために、実行可能な仮想ベースオフセット値が存在します。 vptr +ベースオフセットは親アドレスを与えます。

3)あなたは何を意味しているのか分かりません。 C++コンパイラでそれを実装する方法はいくつかあります。他の言語には、関数をバインドする方法があります。

+0

ありがとう!それは複雑に終了したようです!あなたは私にいくつかの簡単な記事や本を読んでお勧めしますか? –

+0

@NayanaAdassuriya私は母国語の記事でこれらの知識を読んだので、私は英語の本に精通していません。私はあなたが "C + +のメモリレイアウトの仮想継承"をGoogleで検索することができたと思う、偉大な記事がたくさんあります。 – halfelf

関連する問題