前提・実現したいこと
ポリモーフィズムの勉強で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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/25 08:01
2021/05/25 08:20
2021/05/25 11:42