ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

ただいまC・C++勉強中!コミュの関数のオーバーライドについて

  • mixiチェック
  • このエントリーをはてなブックマークに追加
質問があります。よろしくお願いします。

Superクラス内のメンバ関数にMethodとRunがあり、
Run関数内でMethod関数を呼び出しています。
このクラスを継承したSubクラスは、Method関数だけオーバーライドされています。

SubクラスのインスタンスでRun関数を実行した場合、
SubクラスのMethod関数を実行してほしいのですが、うまくいきません。
どうすれば良いのか、どなたか原因と訂正を教えてください。
ただ、Run関数のオーバーライドはしたくない、という希望があります。
ソースは以下のようになってます。


#include<iostream>
using namespace std ;

//スーパークラス
class Super {
private:
//Run関数内で呼び出される関数
void Method() {
cout << "AのMethod" << endl ;
}

public:

void Run() {
Method() ;
}
} ;

//サブクラス
class Sub : public Super {
private:
//Run関数内で呼び出される関数のオーバーライド
void Method() {
cout << "BのMethod" << endl ;
}
} ;

//メイン関数
int main() {
Super().Run() ;
Sub().Run() ;
return 0 ;
}

///////////実際の出力結果//////////////
AのMethod
AのMethod
//////////////////////////////////////



///////////望んでいる出力結果//////////
AのMethod
BのMethod
//////////////////////////////////////

コメント(3)

virtual使って基底クラス(Superクラス)のMethodを定義すればいいんでない?
その通りでした。
virtualというものがあることは知ってましたが、何なのかよく理解できてませんでした。
他人に質問する前によく調べきだ、ということを痛感しました。
単純な質問にお答えいただき、ありがとうございました。
上記はとりあえず、勘で答えただけなので。

親クラスのあるメソッドの振る舞いを子クラスで変えたい場合、あらかじめ親クラスでそのメソッドにvirtualを指定する必要があります、確か。
指定されてないと質問文のような挙動になる……はず。

#んとポインタを使ったときにまた挙動が変わってきた気がしないでもない。必要ならつけたときとつけないときで試してみてください。Super* s = Child(); s->Run();とか
#原因というかなんというか・・・きちんと提示できなくて&適当な回答でごめんなさい。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

ただいまC・C++勉強中! 更新情報

ただいまC・C++勉強中!のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング