質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

3858閲覧

C++ 基底クラスを継承、さらに派生クラスを継承について(エラー)

UE4benkyo-

総合スコア37

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/05/23 14:08

編集2021/05/24 02:25

こんにちは。いま継承をうまいようにつくりたくて試行錯誤しているのですがこのようなエラーがたくさん出てしまいました。

C2504 'Character';定義されていない基底クラスが宣言されています。 C3668 'Player::Update': オーバーライド指定子 'override' を伴うメソッドは、基底クラス メソッドをオーバーライドしませんでした

なにが文法的におかしいでしょうか?

c++

1/*-------- 2Object.h 3--------*/ 4 5 6class Object 7{ 8private: 9 10public: 11 12 Object() 13 {} 14 15 virtual void Initialize()=0; 16 virtual void Update()=0; 17 virtual void Finalize()=0; 18}; 19

C++

1/*-------- 2Character.h 3--------*/ 4 5#include "Object.h" 6 7class Character :public Object 8{ 9private: 10 11public: 12 13 Character() 14 {} 15 16 virtual void Initialize() override 17 {} 18 virtual void Update() override 19 {} 20 virtual void Finalize() override 21 {} 22}; 23

C++

1/*-------- 2Player.h 3--------*/ 4#include "Character.h" 5 6 7class Player :public Character 8{ 9public: 10Player() 11 { 12 ..... 13 } 14 15 virtual void Initialize() override 16 { 17 ..... 18 } 19 virtual void Update() override 20 { 21 ..... 22 } 23 virtual void Finalize() override 24 { 25 ..... 26 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itagagaki

2021/05/23 14:13

2番目のコード、#include "Object のダブルクォートが閉じていませんが。
yukkuri_55

2021/05/23 15:28

エラーコードは全部 cppファイルも書き込んでください。
fana

2021/05/24 00:55

コードが3つほど提示されていますが,各々が何というファイル名なのかを明記すべきでしょう.
int32_t

2021/05/24 03:35

質問文で開示されているコードはとりたてて間違いが見当たりません。ほんとうにこのコードでエラーが出ていますか? エラーがでる完全なコードを開示しましょう。
guest

回答4

0

自己解決

もう一度コードを打ちなおしてみました。
結果はエラーが収まりました。
わからずじまいで終わってしまい申し訳ありませんが、
一応解決したので終わります。
回答いただいた皆様ありがとうございました。

投稿2021/05/29 05:11

UE4benkyo-

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

提示されているコードから、
マスク箇所および欠落箇所(Playerの閉じカッコ不足やmain関数等)を正常に補った場合
文法上のエラーもなく正常に実行できます。

では、なぜエラーが発生するかを発生したエラーメッセージから確認すると
Playerクラスの宣言時にCharacterクラスが宣言されていないように見えます。

推測するに
#include "Player.h"#include "Character.h"より前に行われている事になります。
その状況を再現する最小限の変更としては

c++

1// Character.h 2// Character.hから"Player.h"をCharacterクラスより前にincludeする 3#include "Player.h"

c++

1// Player.h 2// Player.hからCharacter.hがincludeされていない 3// #include "Character.h"

どちらかじゃないかな、という印象です。

投稿2021/05/24 06:06

asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

...なんの問題もありませんが。

C++

1#pragma once 2// Object.h 3 4class Object { 5public: 6 virtual void Initialize() = 0; 7 virtual void Update() = 0; 8 virtual void Finalize() = 0; 9};

C++

1#pragma once 2// Character.h 3 4#include "Object.h" 5 6class Character :public Object { 7public: 8 void Initialize() override {} 9 void Update() override {} 10 void Finalize() override {} 11};

C++

1#pragma once 2// Player.h 3 4#include "Character.h" 5 6class Player : public Character { 7public: 8 9 void Initialize() override {} 10 void Update() override {} 11 void Finalize() override {} 12}; 13

C++

1// main.cpp 2#include <iostream> 3#include "Player.h" 4 5int main() { 6// Object o; 7 Character c; 8 Player p; 9}

投稿2021/05/23 14:23

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

UE4benkyo-

2021/05/24 02:22

ありがとうございます。 epistemeさんのコードは Character.hの関数が純粋仮想関数になっていないのですが、 そこが私のコードの文法のおかしいところですか?
episteme

2021/05/24 03:18

あなたが質問に挙げたコードも純粋仮想関数になっていませんけど?
UE4benkyo-

2021/05/24 03:55

間違いました。 仮想関数でした。
fana

2021/05/24 04:05

大元の Object で virtual と書いている時点でそれは仮想関数である. それを継承した先では "virtual" と明記してもよいし,しなくてもよい.
fana

2021/05/24 04:07

Initialize() を例にすれば,以下のどれでもいい. void Initialize(){} //virtual も override もつけない virtual void Initialize(){} //virtual だけつける void Initialize() override {} //override だけつける virtual void Initialize() override {} //virtual と override の両方つける
episteme

2021/05/24 07:11 編集

フォローありがとです > fana シグニチャが一致していれば自動的に再定義され、"virtual"は不要です。 僕は(回答のとおり)シグニチャの不整合を検出してくれる"override"だけつけるのが好み。
UE4benkyo-

2021/05/24 04:34

そうなんですか。 知りませんでした。教えていただきありがとうございます。
guest

0

#include "Object

これおかしいですね

投稿2021/05/23 14:13

y_waiwai

総合スコア88040

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

UE4benkyo-

2021/05/24 00:34

回答ありがとうございます。 すみません。 そこコピペが失敗したところです。 直しておきます。
y_waiwai

2021/05/24 00:47

#include "Object" って、拡張子ないですが、これであってますか?
fana

2021/05/24 01:54

質問が修正されて,どうやら "Object.h" が正しそうだけども… だとすれば > #include "Object" これ,コンパイル時に「そんなファイルねぇよ」とか怒られそうに思うけど… 仮にその名前のファイルがあったとして内容がコンパイルに耐えるものでなければやはりエラーが起こるハズだしなぁ.
UE4benkyo-

2021/05/24 02:00

たびたびすみません。 直しましたのでよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問