• ベストアンサー

基本クラスのポインタで、派生クラスのメンバ関数を呼び出す方法?

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のメンバ関数ではありませんとなってしまいます。 以上よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.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()が意味のある処理をする } となるから、そちらの方が(効率はさておき)優れていると思いますけど。

yyamada10
質問者

お礼

ご教示ありがとうございました。ご連絡が遅くなって大変申し訳ありません。非常によく分かりました。基本クラスに仮想関数を作成する方法で行ってみます。どうもありがとうございました。

その他の回答 (1)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

static_cast<B*>(a[i])->Read(); でよいのでは? もし、Aが多相クラスであれば、static_castよりdynamic_castを使った方が(効率は落ちますが)安全です。

yyamada10
質問者

お礼

ご教示ありがとうございました。ご連絡が遅くなって大変申し訳ありません。static_cast等も使えるとのことですので、試してみたいと思います。