ではdynamic binding
、ポインタが指しているオブジェクトのタイプに基づいて、関数呼び出しが関数実装にバインドされます。
次のコードがあるとします。
base *bptr = new derived;
bptr->func();
関数func
を基底クラスで virtual と宣言します。次に、動的バインディングにより、仮想関数の派生クラスのバージョンがfunc
実行時に呼び出されます。
上記の考え方は理解できました。
しかし、上記の概念を研究した後に研究した次の概念に混乱しました。
上記のコード スニペットでは、派生クラス オブジェクトへのポインターが基本クラス オブジェクトへのポインターに暗黙的に変換されます。次にbptr
、実際には派生クラス オブジェクトの基本クラス サブオブジェクトを指し、派生クラス オブジェクトを指しません。
基本クラスのポインターbptr
は基本クラスのサブオブジェクトを指しているため、実行時に基本クラスのバージョンの仮想関数func
を呼び出すべきではありませんか?