仮想関数でのオーバーライドでの質問
二つの派生クラスを定義したのですが、一つ目のクラスのメソッドが実行されないで困っています。
下記にソースを載せておきます。
どこが原因でそうなるのかご指摘お願いします。
/*
継承
*/
#include <iostream>
using namespace std;
class Var
{
private:
int value;
static Var* re;
public:
// 静的関数
static bool func() {
// 内部で同一の関数を呼び出す
re->show();
return true;
}
virtual show() {
cout << "message00" << "moji" << endl;
}
// 自身のポインタを取得
Var() { re = this; }
};
Var* Var::re = NULL;
class Msg01 : public Var
{
private:
int value;
public:
show(void) {
cout << "message01" << "moji" << endl;
}
};
class Msg02 : public Var
{
private:
int value;
public:
show(void) {
cout << "message02" << "moji" << endl;
}
};
int main()
{
Msg01 val;
Msg02 msva;
val.func();
msva.func();
getchar();
return 0;
}
/------------------------------------------------------/
実行結果
message02moji
message02moji
/------------------------------------------------------/
message01mojiが表示されるはずなんですが表示されないでいます。
Msg02を宣言したためこのようになってしまったんでしょうか?
No.4ベストアンサー
- 回答日時:
以下、No2の要求に対する簡単な例を挙げます。
#include <iostream>
using namespace std;
//****************************
//
//****************************
class Var
{
private:
public:
virtual void func() {
cout << "message00" << "moji" << endl;
}
};
//****************************
//
//****************************
class Msg01 : public Var
{
private:
public:
void func() {
cout << "message01" << "moji" << endl;
}
};
//****************************
//
//****************************
class Msg02 : public Var
{
private:
public:
void func() {
cout << "message02" << "moji" << endl;
}
};
//****************************
//
//****************************
int main()
{
Msg01 val;
Msg02 msva;
Var *base[2];
base[0] = &val;
base[1] = &msva;
base[0]->func();
base[1]->func();
getchar();
return 0;
}
回答ありがとうございます。
配列として管理すればちゃんとできるんですね。
このやり方でWIndowsプロシージャの継承をやってみようと思います。
No.5
- 回答日時:
関数を static で宣言すると「オブジェクトの情報」は完全に消えますから, static な関数から非static な関数を呼び出すためには消えてしまった「オブジェクトの情報」を static な関数に何らかの形で渡す必要があります. ですから, func を基底クラスに static にしたままで「val.func() から Msg01::show() を呼んでほしい」とか「msva.func() から Msg02::show() を呼んでほしい」というのは本質的にかなり無理があります. func に「実際のオブジェクト」を渡すくらいしかないんじゃないかなぁ.
ちなみに普通「Msg02 を宣言する」といったら class Msg02; だけだし, 拡大解釈しても class Msg02 : public Var { ... }; までだから, これ*だけ*で「Msg01::show を呼ばなくなる」ということはないです. Msg02 のコンストラクタを呼ばなければいい....
早速の回答ありがとうございます。
ウィンドウプロシージャだと静的プロシージャから動的にもってかないと派生クラスを生かせないので
こういった質問をしました。
Taconsan氏の仰る通りだと、ウィンドウプロシージャをクラスに内包して使うのは危険なんでしょうかねぇ。
回答ありがとうございます。
実はWinAPIのプロシージャのクラス化をして継承可能にしようとしている最中なんです。
それでどうしても静的にしなければならないのでこういうプログラムを書いています。
No.2
- 回答日時:
Var* Var::re = NULL;
がグローバル宣言になってるから一個しか存在しない。
Msg01 val;
を実行した時点では Var::re は val だけど
Msg02 msva;
を実行した時点で Var::re は msva に書き換えられてる。
なので val.func(); では msva->show( ) がコールされる。
この回答への補足
このソースの実行結果が正常に
message01moji
message02moji
にするにはどうしたらいいんでしょうか?
ここでも対策できず詰んでしまっています。
二重に質問してしまうのかも知れませんが、もしよろしければお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- その他(プログラミング・Web制作) laravel 本番環境でメールが送れません。 1 2023/02/17 17:57
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
ボタンの複数割り当てについて
-
C#で、あるクラスのメンバーす...
-
C# 矢印キーの取得
-
C#でキーイベントが発生しない...
-
C# WinForm のDataGridView Cel...
-
デスクトップマスコットのドラ...
-
【C#】ソースコードをファイル...
-
Java 他クラスの呼び出しが上手...
-
LVM_SETITEMSTATEでListViewの...
-
C# DataGridView列カスタマイズ
-
Processingでマウスクリックで...
-
C#から、C++で作成したdll内の...
-
C#でのWNetAddConnection3の使...
-
staticな有効範囲の配列の作り...
-
IF関数でEmpty値を設定する方法。
-
C言語のポインターに関する警告
-
System.err. printlnとSystem.o...
-
System.out.printlnの意味がよ...
-
1~100までの数字を表示し、か...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
Junitテストでvoid戻り値メッソ...
-
C#で、あるクラスのメンバーす...
-
C#でのWNetAddConnection3の使...
-
C# visibleプロパティをfalseに...
-
unityでのC++エラーの原因がわ...
-
ボタンの複数割り当てについて
-
C#で別のFormへ複数の値を返そ...
-
エンターキーを押すとOKボタン...
-
LVM_SETITEMSTATEでListViewの...
-
ユーザーコントロールを動的に...
-
[C#.net]スレッド化された別フ...
-
C# 矢印キーの取得
-
C#から、C++で作成したdll内の...
-
C# DataGridView列カスタマイズ
-
C#でキーイベントが発生しない...
-
Thread.sleepのInterruptedExce...
-
C#でのオブジェクトのコピーに...
-
C# 半角カナの文字化けについて
-
文字列の置換
おすすめ情報