- ベストアンサー
基本クラスのポインタで、派生クラスのメンバ関数を呼び出す方法?
VC++でプログラミングをしています。 A(基本クラス) B(派生クラス) を作成しました。Bは、Aの特別な場合です。 このとき、基本クラスAのポインタから、派生クラスBにのみあるメンバ関数を呼ぶことはできないのでしょうか? 基本クラスAにも同じ名前の関数があれば、仮想関数をオーバーロードすれば呼び出せるようですが、この関数は、基本クラスには不要なので、できれば使わないメンバ関数を基本クラスに書きたくありません。 (純粋仮想関数という方法もあるようですが、) 操作としましては、 Aのポインタ配列 A* a[100]を作成し 特別な場合のみ派生クラスBのメンバ関数だけを実行させたいのです。 派生クラスにのみあるメンバ関数を、Readとします。 for(i=0;i<100;i++){ if(派生クラスBの場合){ a[i]->Read() } } 現状では、コンパイルエラーで、 関数Readは、aのメンバ関数ではありませんとなってしまいます。 以上よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>この関数は、基本クラスには不要なので、 >できれば使わないメンバ関数を基本クラスに書きたくありません。 その動機付けがよくわからないのですが、もう少し具体的な話があれば補足にどうぞ。 >for(i=0;i<100;i++){ > if(派生クラスBの場合){ > a[i]->Read(); > } >} これだけ見ると、基底クラス A に何もしない仮想関数 A::Read() を用意して、 これを派生クラス B でオーバーライドすれば if 文不要で for ( i = 0 ; i < 100 ; i++ ) { a[i]->Read(); // a[i] が派生クラス B を指すときのみ Read()が意味のある処理をする } となるから、そちらの方が(効率はさておき)優れていると思いますけど。
その他の回答 (1)
- jacta
- ベストアンサー率26% (845/3158)
static_cast<B*>(a[i])->Read(); でよいのでは? もし、Aが多相クラスであれば、static_castよりdynamic_castを使った方が(効率は落ちますが)安全です。
お礼
ご教示ありがとうございました。ご連絡が遅くなって大変申し訳ありません。static_cast等も使えるとのことですので、試してみたいと思います。
お礼
ご教示ありがとうございました。ご連絡が遅くなって大変申し訳ありません。非常によく分かりました。基本クラスに仮想関数を作成する方法で行ってみます。どうもありがとうございました。