struct Base { virtual ~Base() {} virtual Base *clone() = 0; virtual void hello() = 0; }; struct DerivedA : public Base { ~DerivedA() = default; Base *clone() override; void hello() override; }; struct DerivedB : public Base { ~DerivedB() = default; Base *clone() override; void hello() override; }; struct GameState { GameState(); GameState(const GameState &other); GameState &operator=(const GameState &other); ~GameState(); Base *thing; void switchThing(); };