親クラスの同名メソッド・変数の呼び出し方 – プログラミング – Home

親クラスの同名メソッド・変数の呼び出し...
 
通知
すべてクリア

[解決済] 親クラスの同名メソッド・変数の呼び出し方


ぬりかべ
 ぬりかべ
(@ぬりかべ)
ゲスト
結合: 17年前
投稿: 4
Topic starter  

こんにちわ。C++学習中のものです。
こんなソースをサンプルで書いてみました。

class CSuper {
public:
string aaa;

CSuper();
virtual void operation();
};

class CSub : public CSuper {
public:
string aaa;

CSub();
void operation();
};
--------------------------
CSuper::CSuper() { aaa = TEST; }
void CSuper::operation() { cout << Hello!! ; }

CSub::CSub() { aaa = test; }
void CSub::operation() {
xxxxx.operation();
cout << World!!/ << aaa << endl;
xxxxx.operation();
cout << World!!/ << xxxxx.aaa << endl;
}

void main()
{
CSuper super;
super.operation();

cout << endl;

CSub sub;
sub.operation();

return;
}
----------------------
期待する表示
Hello!!
Hello!! World!!/test
Hello!! World!!/TEST
----------------------
ソース内の「xxxxx」の部分で親クラス(CSuper)のメソッドや変数を
呼びたいのですが、JavaのSuper()に相当する処理はどのようにすれば
良いのでしょうか?

また、CSuperクラスのoperation()の定義部分でvirtualの記述が無くても
エラーなしにビルドできるのですが、virtualは省略可なのでしょうか?
(あるなしで動作が変わる・・・?)
稚拙な質問で済みませんが宜しくお願いします。WinXP(SP2)+VC++2005です。


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> JavaのSuper()に相当する処理はどのようにすれば良いのでしょうか?

CSuper::operation(); と書きます。

> (あるなしで動作が変わる・・・?)

変わります。
以下のようなコードを実行してみるとわかります。

CSuper * super = new CSuper;
super->operation();

CSuper * sub = new CSub;
sub->operation();

delete sub;
delete super;

なお、CSub::operation には virtual があろうがなかろうが、CSuper::operation が
virtual であれば、自動的に virtual になります。
が、個人的には CSub::operation にも virtual を書くのが好きです。


返信引用
FUKU
 FUKU
(@FUKU)
ゲスト
結合: 17年前
投稿: 73
 

因みに __super というのもあります(MS独自仕様ですが)。例えば、

void CSub::operation() {
__super::operation();
}

ま、普通はシャノンさんの仰る通りでしょう


返信引用
ぬりかべ
 ぬりかべ
(@ぬりかべ)
ゲスト
結合: 17年前
投稿: 4
Topic starter  

お返事遅くなりました。
シャノンさん、FUKUさん早速の返事ありがとうございます。
ご教授頂いた内容で動作はしましたが、virtualの件がまだ
腑に落ちません。

シャノンさんの書き込みに、
>>CSub::operation には virtual があろうがなかろうが、CSuper::operation が
>>virtual であれば、自動的に virtual になります。

とありましたが、

CSub::operation()側のvirtualはそうなのですが、
親クラスのCSuper::operation()の方の定義にvirtualキーワードの有無で
違いがあるのかどうかが知りたいのです・・・。

現に、CSuper::operation()の定義からvirtualを外しても、
実行結果は変わりませんでした。(期待値通りです。)
このあたりもひっくるめて省略可なのでしょうか?
(と、思って自分で調べたのですが、親クラスのvirtualが
省略可などとはどこにも書いてないので・・・)

もし引数が違えば、単なるオーバーロードになるのでしょうけども、
関数名も引数も同じ場合はどうなってしまうのかなぁと。。
C++は奥が深いです・・・。

引き続き回答待たせて頂いても良いでしょうか?
宜しくお願い致します。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

virtualと言うキーワードが何を示す物で
それがどういう時に影響するのかをちゃんと抑えないと話が進みません。

シャノンさんが書かれている例のように派生元のポインターや参照を
通して呼び出す場合にvirtualであるかどうかが影響します。
この辺はC++言語の入門書にも書いてあるはずなので
そういった書籍を使って体系的に勉強する事をお勧めします。

何でもそうですが、言語の基本的な知識についてはきちんと抑えないと
それを使って実装されているライブラリの動きも把握できません。
なので、外部のライブラリを使う前にC++言語の文法や観念的な部分
(継承や仮想関数等々)をちゃんと体系的に勉強する必要があります。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

外部ライブラリについては蛇足でした。
只、基本的な知識がとても大切であると言う話は変わりませんけれど。

書籍を使って学習されているのであれば、書籍をもう一度読み返されることを
お勧めします。後は、書籍のどの部分が分からない等ピンポイントな質問だと
レスを付きやすいです。


返信引用
ぬりかべ
 ぬりかべ
(@ぬりかべ)
ゲスト
結合: 17年前
投稿: 4
Topic starter  

PATIOさんありがとうございます。

>>ttp://www.ysaitoh.k.hosei.ac.jp/labor/2002/otogawa/cpp/VirtualFunction.html

ここのサイトのサンプルで、virtualの有無による
振る舞いの違いがわかりました。
参照とポインタの使い分けが良くわかっていないので、
なんとも的外れ(?)な質問になっていたようです。

もっと精進しますm(__)m
皆さんありがとうございました。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

俺が書いたサンプルコードを、virtual の有無を変えて動かしてみましたか?

> 参照とポインタの使い分けが良くわかっていないので、
> なんとも的外れ(?)な質問になっていたようです。

今回の話に関して、参照とポインタの使い分けは関係ないと思いますが…


返信引用
ぬりかべ
 ぬりかべ
(@ぬりかべ)
ゲスト
結合: 17年前
投稿: 4
Topic starter  

はい。実行させて頂きました。
確かに今回は参照やポインタは関係ありませんが、

私が見つけたサイトを読んで、virtualの使い方と
言うか、振る舞いがひとまずわかったかな?と言う
感じです。

コメントありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました