「EffectiveC++」(第3版、118ページ)の項目27で、ScottMeyersは次のように述べています。
class Base { ... };
class Derived: public Base { ... };
Derived d;
Base *pb = &d;
ここでは、派生クラスオブジェクトへの基本クラスポインタを作成しているだけですが、2つのポインタが同じでない場合があります。その場合、実行時に
Derived*
ポインターにオフセットが適用され、正しいBase*
ポインター値が取得されます。この最後の例は、単一のオブジェクト(たとえば、タイプのオブジェクト
Derived
)が複数のアドレス(たとえば、Base*
ポインターによってポイントされたときのアドレスとポインターによってポイントされたときのアドレス)を持つ可能性があることを示していDerived*
ます。
これは少し理解しにくいです。基本クラスへのポインターは、実行時に派生クラスのオブジェクトを指すことができることを知っています。これは、ポリモーフィズムまたは動的バインディングと呼ばれます。しかし、派生クラスオブジェクトは実際にメモリ内に複数のアドレスを持っていますか?
ここで誤解があると思います。誰かがいくつかの説明をすることができますか?多分これは、C ++コンパイラでポリモーフィズムがどのように実装されているかと関係がありますか?