プロが教えるわが家の防犯対策術!

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

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()が意味のある処理をする
}

となるから、そちらの方が(効率はさておき)優れていると思いますけど。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/08 14:50

static_cast<B*>(a[i])->Read();



でよいのでは?
もし、Aが多相クラスであれば、static_castよりdynamic_castを使った方が(効率は落ちますが)安全です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/08 14:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!