- PR -

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

投稿者投稿内容
くれよん
ベテラン
会議室デビュー日: 2005/04/28
投稿数: 74
投稿日時: 2006-12-12 17:59
みなさんお返事ありがとうございます。

C++のvirtualは、何とか理解できそうです。

しかし、るぱんさんの書き込み
引用:

るぱんさんの書き込み (2006-12-12 15:50) より:
るぱんです。

クラスB内部で
super.メソッド1


が、よくわかりません。もう少し詳しくお願いします。よろしくお願いします。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2006-12-12 18:21
るぱんです。
引用:

くれよんさんの書き込み (2006-12-12 17:59) より:
しかし、るぱんさんの書き込み
引用:

るぱんさんの書き込み (2006-12-12 15:50) より:
るぱんです。

クラスB内部で
super.メソッド1


が、よくわかりません。もう少し詳しくお願いします。よろしくお願いします。


super
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-12-12 18:54
> クラスB内部で
> super.メソッド1

そういうことじゃなくて。
クラスAから呼び出す方法はないかって言っているんでしょ。

>JavaでC++の様な書き方をする方法

クラスAからって意味では文法上サポートされてない。
thisポインタがどのクラスのインスタンスにあたるのかを意識して書くとそういう使い方にはならんと思うんだけど。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-12 19:10
Insider.NET 会議室よりか、Java Solution 会議室の方が良かったかもしれないですね。
(C++/CLI でも、Managed C++ でも、J# でもないのですから)

引用:

ぶさいくろうさんの書き込み (2006-12-12 18:54) より:

クラスAからって意味では文法上サポートされてない。


Java、C#、J# ともにサポートされていませんが、VB ならば、MyClass キーワードがあります。使いどころありませんけどw

# Insider.NET 会議室的なことを書いてみました。

引用:

thisポインタがどのクラスのインスタンスにあたるのかを意識して書くとそういう使い方にはならんと思うんだけど。


意図的に呼び出すのであれば、super (base | MyBase) で明示的に呼び出しますからね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-12-12 20:23
コードを書いて、「こんな動きを期待してる」と具体的に書けば伝わりやすいですね。
たぶん、final の事言ってるんじゃないのかな。
_________________
囚人のジレンマな日々
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2006-12-12 22:20
Effective C++ 第3版 - プログラムとデザインを改良するための55項目
を一度ごらんになってみると良いと思います。
(Effective Java - プログラミング言語ガイド よりわかりやすいです)
くれよん
ベテラン
会議室デビュー日: 2005/04/28
投稿数: 74
投稿日時: 2006-12-13 00:28
みなさんお返事ありがとうございます。質問の仕方が悪かったせいで、皆さんを混乱させてしまったようです。これまでの話を最初から、まとめます。

当方はjavaメインでプログラムを書いています。
しかし、C++でプログラムを書く機会があり、
JavaとC++のオーバーライドの違いに気がつきました。
以降、JavaとC++によるサンプルプログラムです。

(※)以下サンプルプログラムのみです。
  サンプルプログラム挙動・やりたい事・解決方法は、次の投稿で書きます。

以下 A.java
コード:

public class A {
public void method1(){
System.out.println("クラスA メソッド1");
method2();
}

public void method2(){
System.out.println("クラスA メソッド2");
}
}




以下 B.java
コード:

public class B extends A {
public void method2(){
System.out.println("クラスB メソッド2");
}

public static void main(String [] args) {
B a = new B();
a.method1();
}
}




以下 A.h
コード:

#pragma once
class A
{
public:
A(void);
public:
~A(void);

void method1(void);
void method2(void);
};




以下 A.cpp
コード:

#include "A.h"
#include <stdio.h>
A::A(void)
{
}
A::~A(void)
{
}

void A::method1(void)
{
printf("クラスA メソッド1 \n");
method2();
}
void A::method2(void)
{
printf("クラスA メソッド2 \n");
}




以下 B.h
コード:

#pragma once
#include "A.h"

class B :
public A
{
public:
B(void);
public:
~B(void);

void method2(void);
};




以下 B.cpp
コード:

#include "B.h"
#include <stdio.h>
B::B(void)
{
}

B::~B(void)
{
}

void B::method2(void)
{
printf("クラスB メソッド2 \n");
}




以下 main.cpp
コード:

#include "B.h"

int main()
{
B b;
b.method1();

return 0;
}



[ メッセージ編集済み 編集者: くれよん 編集日時 2006-12-13 00:30 ]
くれよん
ベテラン
会議室デビュー日: 2005/04/28
投稿数: 74
投稿日時: 2006-12-13 01:00
javaサンプルプログラムの実行結果
クラスA メソッド1
クラスB メソッド2
となります。

C++サンプルプログラムの実行結果
クラスA メソッド1
クラスA メソッド2
となります。

私はC++でも、Javaと同様の実行結果を期待していたのですが、
オーバーライドに違いがある事が分かりました。
皆さんから教えていただいた解決方法は、
C++でメソッドを宣言する時に「virtual」をつける事で、
Javaと同様の動作をさせる事ができるというものです。

以下 A.h(改)
コード:
#pragma once

class A
{
public:
	A(void);
public:
	~A(void);

	void method1(void);
	virtual void method2(void);
};



私の
>ちなみに余談ですが、JavaでC++の様な書き方をする方法はあるのでしょうか・・・。
という投稿は、virtualを付けA.hを改造する前の実行結果を
javaにさせる方法があるか、否かという事です。

が、たぶんそんな書き方しないですね。

ごめんなさい。変な質問しました。

本題のC++の方はvirtualで解決する事が出来ました。
ありがとうございました。

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