#include #include class NPC { public: NPC(std::string const& name) : name {name} {} virtual ~NPC() = default; virtual std::string greeting() const { return "Hello, my name is " + name; } protected: std::string name; }; class Bandit : public NPC { public: Bandit(std::string const& name, bool angry) : NPC {name}, angry {angry} {} std::string greeting() const override { if (angry) { return "Never should have come here!"; } else { return NPC::greeting(); } } private: bool angry; }; class Guard : public NPC { public: using NPC::NPC; std::string greeting() const override { return "Stop in the name of the jarl! I am " + name; } }; void greet_npc(NPC const& npc) { std::cout << npc.greeting() << std::endl; } int main() { NPC saadia {"saadia"}; Bandit galmar {"galmar", true}; Bandit hrongar {"hrongar", false}; Guard lydia {"lydia"}; greet_npc(saadia); greet_npc(galmar); greet_npc(hrongar); greet_npc(lydia); return 0; }