掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
クラス継承について (ID:56529)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
最初の質問は難しいので後回しにして、後者のほうを先に。 7,8,9 は A* pa1=&b; pa1->hoge(); ですね。 非仮想なメンバ関数はソースコードの見た目の型のものが呼ばれる。 仮想なメンバ関数はソースコードの見た目によらず実際の型のものが呼ばれる。 というふうに C++ の仕様が決まっているので、そう動作します。 この例の場合、関数呼び出しは pa1 によって行われています。 pa1 の型は A* なので A::hoge が呼ばれます。 >(というより、いつの間に、インスタンスb,cがクラスAのインスタンスになって >しまったのか・・・) インスタンスは変わっていません。 基底クラスへのポインタで派生クラスのインスタンスを指しているだけです。 基底クラスへのポインタは派生クラスのインスタンスを指せるのです。 逆はダメ。 11 は仮想なメンバ関数を呼んでいるので、ソースコードの見た目の型 (pa1 の型つまり A*) によらず実体である B の関数 B::foo が呼ばれています。 a1=b; a2=c; は理解が難しい話になります。ここでは「スライシング」が起きています。 a1 も a2 も A 型なので、どう転んでも B 型や C 型の内容を入れることはできません。 なので b のうちの A の部分だけ、 c のうちの A の部分だけが a1 a2 に入れられています。 a1 も a2 も A 型なので A::foo A::hoge が呼ばれるのが正しい動きとなります。 予期せぬスライシングはバグの元なので、意図してそう書いたのならかまいませんが、 a1=b; のようなコードは書くべきではありません。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.