2011-01-11 11 views
11

仮想ポインタとは何ですか? こんにちは、すべて、 今日私は電話インタビューを受けて、 "仮想ポインタとは何ですか?"という質問がありました。 私はこれを見つけたので、終了した後、私はGoogleを試しました。残念ながら、それは私に仮想テーブル参照のみを与えました。仮想ポインタ

だから、普通の英語の仮想ポインタは何ですか?どのように定義しますか?

ありがとうございます。

+5

あなたのインタビュアーがvtbl構造内の単一のエントリについて話していない限り、私が知っている限り、そのようなことはありません。 –

+1

仮想*テーブル*ポインタ? –

+0

これは高度なインタビューの質問で、C++オブジェクトモデルの実装の詳細がどれくらいよくわかっているかを調べるためのものでした。 –

答えて

14

"仮想ポインタ"のようなものはありません。

は、インタビュアーが意味しているかもしれないいくつかのことがあります。

  • ポリモーフィッククラス
  • 多型クラスのvtableの(信用@Maxim)
  • ポインタ内へのポインタへのポインタ多型クラスのvtableの
  • オーバーライドoperator->
  • スマートポインタオブジェクト仮想メンバ関数(マチューM @クレジット)へのポインタ

「仮想ポインタ」に関する限り、そのようなものはありません。

+0

@ジョン:可能性のあるリストに仮想メンバー関数へのポインタを追加します。 –

+0

@Matthieu:良い提案、編集。 –

+0

上記の回答のいずれかを使用して、インタビューに失敗する可能性が最も高いです。 –

4

私の解釈は、vtableの内容 - 仮想メソッドへのポインタです。

非常に良い表現ではありませんが、IMHO。

1

また、隠されたクラスのメンバは、仮想と呼ばれる

2

C++コンパイラが作成されます...父の方法の純粋な、まだそれが良い文言はありませんが、子供とそれを呼び出す仮想/仮想の関数ポインタを作成することができ-pointerまたは1つ以上の仮想関数がある場合は短いvptrにあります。このvptrは、関数ポインタのテーブルを指すポインタです。このテーブルは、コンパイラによって作成され、仮想関数テーブルまたはvtableと呼ばれます。 vtableの各行は、対応する仮想関数を指す関数ポインタです。

レイトバインディングを実行するために、コンパイラは仮想関数を含む各クラスとそのクラスから派生したクラスに対してこのvtableテーブルを作成します。コンパイラはその特定のクラスの仮想関数のアドレスを 'vtable'に配置します。

基本クラスポインタを使用して仮想関数呼び出しを行うと、コンパイラは静的にVPTRをフェッチし、VTABLE内の関数アドレスをルックアップして正しい関数を呼び出し、遅延/動的バインディングを発生させるコードを挿入します。