質問: ポリモーフィズムの実装で、原型クラスのポインタを使って、なぜ派生クラスを指し示すようになったのでしょうか? class Girl;public Humanというのは物理的にどのように設定されているのでしょうか? humanクラスから派生されたから、human classのポインターで派生クラスを示せるというのは概念的、機能的には理解できますが、それがどのようにプログラムされたのか気になりました。 派生というものが、どのように実装されたのかに触れて説明していただけると嬉しいです。 皆さま、よろしくお願いします。 お二方、仮想関数についてはよく理解できました、ありがとうございました! しかしptr=&aliceについて疑問があります。 ptrはhumanクラスのポインターであって、ガールやボーイクラスのポインタではないですよね、ポインタはどのように、指すクラスが適切なのかを判断しているのでしょうか? 全く関係ない魚クラスを作って、humanクラスのポインタでは指すことはできませんよね。 度々申し訳ありません、よろしくお願いします。 ``` コード class Human{ // 基底クラス public: virtual void speak(){ printf("I am human.\n"); } // 仮想関数 }; class Girl : public Human{ public: void speak(){ printf("I am girl.\n"); } }; class Boy : public Human{ public: void speak(){ printf("I am boy.\n"); } }; int main(void) { Human *ptr; Girl alice; Boy bob; ptr=&alice; ptr->speak(); ptr=&bob; ptr->speak(); return(0); } ```
回答: すいません、取り急ぎリンクだけ。 ここが分かりやすかったです。 【追記】 virtualをつけるとその関数への`ポインタA`が、クラスの隠しメンバ変数としてこっそり追加されます。 具体的には下記のようになります。 ``` HumanクラスのポインタAには、void speak(){ printf("I am human.\n"); }へのポインタ Girl クラスのポインタAには、void speak(){ printf("I am girl.\n"); } へのポインタ Boy クラスのポインタAには、void speak(){ printf("I am Boy.\n"); } へのポインタ ``` そして、ptr=&alice;の時、ptrはGirlクラスのインスタンスを指しているため、 そのポインタAには`void speak(){ printf("I am girl.\n"); }`へのポインタが入ってます。 従って、ptr->speak();を呼び出すと、`void speak(){ printf("I am girl.\n"); }`が呼ばれます。 bobの場合も同様なのです。 なお、仮想関数は複数存在できるので、隠し関数ポインタは配列として実装され、vtableと呼ばれています。