こんにちわ。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です。
> 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 を書くのが好きです。
因みに __super というのもあります(MS独自仕様ですが)。例えば、
void CSub::operation() {
__super::operation();
}
ま、普通はシャノンさんの仰る通りでしょう
お返事遅くなりました。
シャノンさん、FUKUさん早速の返事ありがとうございます。
ご教授頂いた内容で動作はしましたが、virtualの件がまだ
腑に落ちません。
シャノンさんの書き込みに、
>>CSub::operation には virtual があろうがなかろうが、CSuper::operation が
>>virtual であれば、自動的に virtual になります。
とありましたが、
CSub::operation()側のvirtualはそうなのですが、
親クラスのCSuper::operation()の方の定義にvirtualキーワードの有無で
違いがあるのかどうかが知りたいのです・・・。
現に、CSuper::operation()の定義からvirtualを外しても、
実行結果は変わりませんでした。(期待値通りです。)
このあたりもひっくるめて省略可なのでしょうか?
(と、思って自分で調べたのですが、親クラスのvirtualが
省略可などとはどこにも書いてないので・・・)
もし引数が違えば、単なるオーバーロードになるのでしょうけども、
関数名も引数も同じ場合はどうなってしまうのかなぁと。。
C++は奥が深いです・・・。
引き続き回答待たせて頂いても良いでしょうか?
宜しくお願い致します。
virtualと言うキーワードが何を示す物で
それがどういう時に影響するのかをちゃんと抑えないと話が進みません。
シャノンさんが書かれている例のように派生元のポインターや参照を
通して呼び出す場合にvirtualであるかどうかが影響します。
この辺はC++言語の入門書にも書いてあるはずなので
そういった書籍を使って体系的に勉強する事をお勧めします。
何でもそうですが、言語の基本的な知識についてはきちんと抑えないと
それを使って実装されているライブラリの動きも把握できません。
なので、外部のライブラリを使う前にC++言語の文法や観念的な部分
(継承や仮想関数等々)をちゃんと体系的に勉強する必要があります。
外部ライブラリについては蛇足でした。
只、基本的な知識がとても大切であると言う話は変わりませんけれど。
書籍を使って学習されているのであれば、書籍をもう一度読み返されることを
お勧めします。後は、書籍のどの部分が分からない等ピンポイントな質問だと
レスを付きやすいです。
PATIOさんありがとうございます。
>>ttp://www.ysaitoh.k.hosei.ac.jp/labor/2002/otogawa/cpp/VirtualFunction.html
ここのサイトのサンプルで、virtualの有無による
振る舞いの違いがわかりました。
参照とポインタの使い分けが良くわかっていないので、
なんとも的外れ(?)な質問になっていたようです。
もっと精進しますm(__)m
皆さんありがとうございました。
俺が書いたサンプルコードを、virtual の有無を変えて動かしてみましたか?
> 参照とポインタの使い分けが良くわかっていないので、
> なんとも的外れ(?)な質問になっていたようです。
今回の話に関して、参照とポインタの使い分けは関係ないと思いますが…
はい。実行させて頂きました。
確かに今回は参照やポインタは関係ありませんが、
私が見つけたサイトを読んで、virtualの使い方と
言うか、振る舞いがひとまずわかったかな?と言う
感じです。
コメントありがとうございました。