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

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

新規登録して質問してみよう
ただいま回答率
85.35%
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

C++

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

Q&A

解決済

1回答

1850閲覧

ポリモーフィズムとオーバーライドについて

sisyamo22369

総合スコア1

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

C++

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

0グッド

0クリップ

投稿2021/05/25 06:41

前提・実現したいこと

ポリモーフィズムの勉強でpetクラスの純粋仮想関数をオーバーライドをしてhumanで呼び出したいんですがうまくいかなくて困っています。
ネットで調べてもよくわからないのでここで質問します。

発生している問題・エラーメッセージ

エラー C2011 'Pet': 'class' 型の再定義 pet.h 3 エラー C2504 'Pet': 定義されていない基底クラスが宣言されています。 dog.h 7 エラー C3668 'Dog::Action': オーバーライド指定子 'override' を伴うメソッドは、基底クラス メソッドをオーバーライドしませんでした dog.h 14 エラー C2440 '=': 'Dog *' から 'Pet *' に変換できません。 human.cpp 9 エラー C2027 認識できない型 'Pet' が使われています。 human.cpp 11 エラー C2027 認識できない型 'Pet' が使われています。 human.cpp 15

human.cpp

#include "human.h" Human::Human() { Dog dog("poti"); Cat cat("tama"); Pet* pPet; pPet = &dog; pPet->Action(); pPet = &cat; pPet->Action(); }

cat.h

// cat.h #include<string> #include<iostream> #include "pet.h" class Cat :public Pet { public: Cat():m_name("名無しの猫"){} Cat(const std::string&name) :m_name(name){} void Action(void) override { std::cout << m_name<< "は「にゃ~ん」と鳴いた" << std::endl; } private: std::string m_name; };

dog.h

// dog.h #include<string> #include<iostream> #include "pet.h" class Dog: public Pet { public: Dog() :m_name("名無しの犬") {} Dog(const std::string&name) :m_name(name) {} void Action(void) override { std::cout << m_name << "は「わんわん」と鳴いた" << std::endl; } private: std::string m_name; };

pet.h

class Pet { // 純粋仮想関数を持つクラスは自分自身でインスタンスを持つことが出来ないのインターフェイスに向いている public: virtual void Action(void) = 0; };

試したこと

何が足りないのかわからん

補足情報(FW/ツールのバージョンなど)

visualstudio 2017

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

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

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

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

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

guest

回答1

0

ベストアンサー

多重includeしてますね。

pet.h の先頭に
#pragma once
つけてみて。

あるいは

先頭に
#ifndef PET_H__
#define PET_H__

末尾に
#endif

つけてみて。

投稿2021/05/25 06:57

episteme

総合スコア16612

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

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

sisyamo22369

2021/05/25 08:01

LNK2019 未解決の外部シンボル _main が関数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) で参照されました。2\LIBCMTD.lib(exe_main.obj)1 一応これで再定義のところは治りました! しかし次にこんなエラーが出てきました。
episteme

2021/05/25 08:20

うん、それで? int main() が定義されてないのでは?
episteme

2021/05/25 11:42

...解決したの?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問