#pragma once #include class HumanT { public: HumanT(std::string newName); virtual ~HumanT() = default; virtual std::string Greet() const = 0; protected: std::string name; }; class BardT : public HumanT { public: BardT(std::string newName): HumanT{newName} {}; virtual ~BardT() = default; std::string Greet() const override; virtual std::string Perform() const; }; class SingerT : public BardT { public: SingerT(std::string newName): BardT{newName} {}; virtual ~SingerT() = default; std::string Greet() const override; std::string Perform() const override; }; class MagicHumanT: public HumanT { public: MagicHumanT(std::string newName): HumanT{newName} {}; virtual ~MagicHumanT() = default; std::string Greet() const override; virtual std::string DoTricks() const; }; class CardUserT: public MagicHumanT { public: CardUserT(std::string newName): MagicHumanT{newName} {}; virtual ~CardUserT() = default; std::string Greet() const override; std::string DoTricks() const override; }; class SingingCardUserT final: public CardUserT, public SingerT { public: SingingCardUserT(std::string newName): CardUserT(newName+ " Card_Using_Singer"), SingerT(newName + " Singing_Card_User") {}; virtual ~SingingCardUserT() = default; std::string Greet() const override; std::string DoTricks() const override; std::string Perform() const override; }; /* class LoungeLizardT : SingingCardUserT { }; */