- PR -

JavaとC++のオーバーライドの違いついて

投稿者投稿内容
くれよん
ベテラン
会議室デビュー日: 2005/04/28
投稿数: 74
投稿日時: 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の様に処理する事は出来ないのでしょうか。
よろしくお願いします。
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2006-12-12 15:27
クラスAのメソッド2の宣言に、「virtual」を付けるとJavaと同じ挙動になります。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-12 15:33
引用:

くれよんさんの書き込み (2006-12-12 15:22) より:

C++では、 クラスAのメソッド1、クラスAのメソッド2と処理されるようですが、


メソッドを呼び出すためのインスタンス (参照) は正しいと仮定して。

基本クラスのメソッド 2 は、「仮想関数」 になっていますか?
「virtual 修飾子」 をつけましょう。

Java はデフォルトで virtual (Overridable) ですが、C++ は違います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-12-12 15:34
引用:

スフレさんの書き込み (2006-12-12 15:27) より:
クラスAのメソッド2の宣言に、「virtual」を付けるとJavaと同じ挙動になります。



コンストラクタ内での挙動が微妙に違ったような?

C++では継承元のコンストラクト中のオブジェクトのvtblは、
継承元クラスのvtblになっていたような記憶があります。

デストラクタも同様だったと思います。

もう長い事使っていないので怪しげですけど。。
くれよん
ベテラン
会議室デビュー日: 2005/04/28
投稿数: 74
投稿日時: 2006-12-12 15:46
皆さん、お返事ありがとうございます。

ご指摘通り、メソッドの宣言にvirtualをつける事で解決する事ができました。
ありがとうございました。


ちなみに余談ですが、JavaでC++の様な書き方をする方法はあるのでしょうか・・・。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2006-12-12 15:50
るぱんです。

クラスB内部で
super.メソッド1
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2006-12-12 17:04
こんばんは。

引用:

コンストラクタ内での挙動が微妙に違ったような?

C++では継承元のコンストラクト中のオブジェクトのvtblは、
継承元クラスのvtblになっていたような記憶があります。

デストラクタも同様だったと思います。



コンストラクタ内では、仮想関数は正しく呼び出されないですが、
デストラクタ内では、大丈夫です。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-12 17:28
コンストラクタで仮想メソッドを呼ぶ (wankuma.com)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)