- - PR -
JavaとC++のオーバーライドの違いついて
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-12-12 15:22
こんにちわ。いつも勉強させて頂いています。
どちらに投稿しようか迷いましたが、Insider.NETに投稿させていただきます。 Javaでプログラムを書く事が多いのですが、C++でプログラムを書く機会があり、 JavaとC++のオーバーライドの違いついて疑問が生じたので投稿させていただきます。 クラスAに、メソッド1、メソッド2があります。 メソッド1はメソッド2を呼び出します。 クラスBは、クラスAを継承し、メソッド2をオーバーライドします。 ここで、クラスBからメソッド1を呼び出した場合、 Javaでは、クラスAのメソッド1、クラスBのメソッド2と処理されます。 C++では、 クラスAのメソッド1、クラスAのメソッド2と処理されるようですが、 C++でJavaの様に処理する事は出来ないのでしょうか。 よろしくお願いします。 | ||||
|
投稿日時: 2006-12-12 15:27
クラスAのメソッド2の宣言に、「virtual」を付けるとJavaと同じ挙動になります。
| ||||
|
投稿日時: 2006-12-12 15:33
メソッドを呼び出すためのインスタンス (参照) は正しいと仮定して。 基本クラスのメソッド 2 は、「仮想関数」 になっていますか? 「virtual 修飾子」 をつけましょう。 Java はデフォルトで virtual (Overridable) ですが、C++ は違います。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2006-12-12 15:34
コンストラクタ内での挙動が微妙に違ったような? C++では継承元のコンストラクト中のオブジェクトのvtblは、 継承元クラスのvtblになっていたような記憶があります。 デストラクタも同様だったと思います。 もう長い事使っていないので怪しげですけど。。 | ||||
|
投稿日時: 2006-12-12 15:46
皆さん、お返事ありがとうございます。
ご指摘通り、メソッドの宣言にvirtualをつける事で解決する事ができました。 ありがとうございました。 ちなみに余談ですが、JavaでC++の様な書き方をする方法はあるのでしょうか・・・。 | ||||
|
投稿日時: 2006-12-12 15:50
るぱんです。
クラスB内部で super.メソッド1 | ||||
|
投稿日時: 2006-12-12 17:04
こんばんは。
コンストラクタ内では、仮想関数は正しく呼び出されないですが、 デストラクタ内では、大丈夫です。 | ||||
|
投稿日時: 2006-12-12 17:28
コンストラクタで仮想メソッドを呼ぶ (wankuma.com)
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |
1|2|3
次のページへ»