dynamic binding
では、関数呼び出しは、ポインタが指しているオブジェクトの型に基づいて関数の実装にバインドされます。 基本クラスのサブオブジェクトへのポインタ。どの仮想関数のバージョンが呼び出されますか?
base *bptr = new derived;
bptr->func();
が機能
func
は、基本クラスの仮想宣言されてみましょう:
は、我々は次のコードがあるとします。次に、派生クラスの仮想関数func
のバージョンは、動的バインディングのために実行時に呼び出されます。
私は上記の考え方を理解しています。
しかし、私は上記の概念を勉強した後、私が学んだ以下のコンセプトで混乱しました。
上記のコードスニペットでは、派生クラスオブジェクトへのポインタは、暗黙的にベースクラスオブジェクトへのポインタに変換されます。次にbptr
は、実際には、派生クラスオブジェクトの基本クラスのサブオブジェクトを指し、派生クラスオブジェクトを指していません。
基本クラスポインタbptr
が基本クラスのサブオブジェクトを指しているため、実行時に基本クラスの仮想関数のバージョンfunc
を呼び出さないでください。この例では
David:派生クラスオブジェクトのvptrとその基底クラスサブオブジェクトのvptrの両方が派生クラスVTABLEを指していますか? –
@Linux - vptrはオブジェクトの実際の型のvtableを指します。あなたがここで問題ないオブジェクトを指すのに使うポインタ*。 –
@LinuxPenseur:派生型が新しい仮想関数を宣言しないと仮定すると、派生vtableを指す基本サブオブジェクトに格納される単一のポインタが存在します。 –