関数のオーバーライドがされていない。(初学者)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

関数のオーバーライドがされていない。(初学者)

#1

投稿記事 by keito94 » 7年前

関数のオーバーライドと言うものを利用して、何かのプログラムを作ろうとしているのですが、
どういうわけか関数のオーバーライドがされず、黒い画面のみが表示されるのみです。
関数がオーバーライドされない原因はどこにありますか?

メインプログラムの宣言

コード:

	virtual void Move() {}
	virtual void Draw() {}
メインプログラム

コード:

void CGameMain::Run() {
	Move();
	Draw();
}
オーバーライドされる部分の宣言

コード:

	virtual bool Move();
	virtual void Draw();
オーバーライドされる部分

コード:

bool CPlayer::Move() {
	JoyPad.Update();
	if (JoyPad.Get(PAD_INPUT_LEFT)) {
		VX = -3.0F;
		Dir = 1;
	}
	else if (JoyPad.Get(PAD_INPUT_RIGHT)) {
		VX = 3.0F;
		Dir = 0;
	}
	else {
		VX = 0;
	}
	return true;
}

void CPlayer::Draw() {
	DrawRotaGraphF(X, Y, 1.0, 0, Game->PlayerGh[0], TRUE, Dir);
}
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 関数のオーバーライドがされていない。(初学者)

#2

投稿記事 by Dixq (管理人) » 7年前

提示されているプログラムの抜粋が良くないです。
どこが親クラスなのかどこが子クラスなのかどこに継承しているのかが良く分かりません。
オーバーライド先にはvirtuslではなくoverride修飾子を使いますし、
メインプログラムが継承元のように見えますが、そこから派生するのもおかしいです。
全体を見せてください。

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: 関数のオーバーライドがされていない。(初学者)

#3

投稿記事 by keito94 » 7年前

>>DIXQさん
わかりました。
ソースコード全体を掲示します。
Joypad.h

コード:

#pragma once

class CJoyPad {
public:
	int Input, EdgeInput;
	void Update();
	int Get(int JoyPadCode);
};
JoyPad.cpp

コード:

#include "Main.h"
#include "JoyPad.h"

void CJoyPad::Update() {
	int i;
	i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
	EdgeInput = i & ~Input;
	Input = i;
}
 
int CJoyPad::Get(int JoyPadCode) {
	return Input&JoyPadCode;
}
Player.h

コード:

#pragma once
#include "Mover.h"

class CPlayer : public CMover {
	int Dir;
public:
	CPlayer(float x, float y);
	virtual bool Move();
	virtual void Draw();
};
Player.cpp

コード:

#include "Main.h"
#include "Player.h"
#include "JoyPad.h"
CJoyPad JoyPad;
CPlayer::CPlayer(float x, float y)
	:CMover(x, y, -8, -8, 8, 8),Dir(0) {

}

bool CPlayer::Move() {
	JoyPad.Update();
	if (JoyPad.Get(PAD_INPUT_LEFT)) {
		VX = -3.0F;
		Dir = 1;
	}
	else if (JoyPad.Get(PAD_INPUT_RIGHT)) {
		VX = 3.0F;
		Dir = 0;
	}
	else {
		VX = 0;
	}
	return true;
}

void CPlayer::Draw() {
	DrawRotaGraphF(X, Y, 1.0, 0, Game->PlayerGh[0], TRUE, Dir);
}
Mover.h

コード:

#pragma once
class CMover {
public:
	float X, Y, L, T, R, B;
	float VX, VY;
	CMover(float x, float y);
	CMover(float x, float y, float l, float t, float r, float b);
	bool Hit(CMover* m);
};
Mover.cpp

コード:

#include "Mover.h"

CMover::CMover(float x, float y)
	:X(x), Y(y) {

}

CMover::CMover(float x, float y, float l, float t, float r, float b)
	:X(x), Y(y), L(l), T(t), R(r), B(b), VX(0.0F), VY(0.0F) {

}
bool CMover::Hit(CMover* m) {
	return X + L < m->X + m->R&& m->X + m->L < X + R&&Y + T < m->Y + m->B&&m->Y + m->T < Y + B;
}
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
purin52002
記事: 235
登録日時: 7年前
連絡を取る:

Re: 関数のオーバーライドがされていない。(初学者)

#4

投稿記事 by purin52002 » 7年前

管理人さんの言う通りvirtualのつけ方を間違ていると思います。

コード:


class Super
{
public:
    virtual void func();//ベースクラスでvirtual
};

class Sub : public Super
{
public:
    void func() override;//派生クラスでoverrideと書いておくと仮想関数がなかった場合にエラーを出してくれる
};

派生クラスのCPlayerにvirtualがついているので、CMoverにつけてあげてください。
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: 関数のオーバーライドがされていない。(初学者)

#5

投稿記事 by keito94 » 7年前

virtualをCMoverにつけてあげたのですが、プログラムの画像が表示されません。
メインプログラムのコードをあげます。どこかおかしな点はありますか?
Main.h

コード:

#pragma once
#include "DxLib.h"
class CGameMain {
public:
	int PlayerGh[32];
	CGameMain();
	~CGameMain();
	void FirstInit();
	void Run();
	virtual void Move() {}
	virtual void Draw() {}
};
extern CGameMain* Game;
Main.cpp

コード:

//デバッグのトレーニングついでに作り直す。
#include "Main.h"
#include "Player.h"
CGameMain* Game;

CGameMain::CGameMain() {
	ChangeWindowMode(TRUE); SetGraphMode(320, 240, 32), SetUseCharSet(DX_CHARSET_UTF8);
	DxLib_Init();
	SetDrawScreen(DX_SCREEN_BACK);
	LoadDivGraph("自作キャラ.bmp", 32, 8, 4, 16, 16, PlayerGh);
}

CGameMain::~CGameMain(){
	DxLib_End();
}
void CGameMain::FirstInit() {
	new CPlayer(160, 120);
}

void CGameMain::Run() {
	Move();
	Draw();
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	Game = new CGameMain();
	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
		Game->Run();
	}
	delete Game;
}
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
usao
記事: 1887
登録日時: 11年前

Re: 関数のオーバーライドがされていない。(初学者)

#6

投稿記事 by usao » 7年前

>どこかおかしな点はありますか?

何がおかしいのかを問うよりも前に,
まず,
このコードが どのように動くと想定しているのか について具体的に説明した方が早そうです.
提示コードからではそのあたりの事柄が読み取れません.

かずま

Re: 関数のオーバーライドがされていない。(初学者)

#7

投稿記事 by かずま » 7年前

keito94 さんが書きました:メインプログラムのコードをあげます。どこかおかしな点はありますか?
Main.cpp の 17行目がおかしい。
new CPlayer(160, 120) の実行結果であるポインタをどこにも格納していません。
これでは、生成された CPlayerオブジェクトを使用することができません。
こんなことを書くということは、C++ の基礎を全く理解していないと思われます。

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: 関数のオーバーライドがされていない。(初学者)

#8

投稿記事 by keito94 » 7年前

usao さんが書きました: このコードが どのように動くと想定しているのか について具体的に説明した方が早そうです.
提示コードからではそのあたりの事柄が読み取れません.
Main.cppのMoveとDrawにPlayer.cppのMoveとDrawをオーバーライドさせ、Runでそれを動作させるのですが、
実行してみるとMain.cppのMoveとDrawにPlayer.cppのMoveとDrawが何故かオーバーライドされず、黒い画面が表示されてしまいます。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
purin52002
記事: 235
登録日時: 7年前
連絡を取る:

Re: 関数のオーバーライドがされていない。(初学者)

#9

投稿記事 by purin52002 » 7年前

継承をちゃんと理解されてないのかもしれません。

コード:

#include<iostream>
using namespace std;

class Super
{
public:
    virtual void func() { cout << "super" << endl ; }
};

class Sub : public Super 
{
public:
    void func(){ cout << "sub" << endl ; }
};

int main()
{
    Super* super = new Super();//Superクラスを作る
    Super* sub = new Sub();//Subクラスを作る

    super->func();// super と表示
    sub->func();// sub と表示
}
keito94さんはせっかく派生クラスを作ったのに基底クラスをnewしているみたいです。
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: 関数のオーバーライドがされていない。(初学者)

#10

投稿記事 by keito94 » 7年前

皆様方は、僕が継承もわからないC++初心者であることをよくご指摘なさいました。
この件は一旦解決とさせていただき、C++の訓練に励みたいと思います。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
purin52002
記事: 235
登録日時: 7年前
連絡を取る:

Re: 関数のオーバーライドがされていない。(初学者)

#11

投稿記事 by purin52002 » 7年前

クラスはややこしいですが、使えるようになると非常に強力な武器になるはずです。
ふぁいと^p^
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

返信

“C言語何でも質問掲示板” へ戻る