#include using namespace std; struct House { virtual House* clone() = 0; virtual string name() = 0; }; struct Person { House *housePtr = nullptr; Person() : housePtr(nullptr) {} void assignHouse(House* ptr) { housePtr = ptr; } string houseName() { if (housePtr == nullptr) return "NULL"; else return housePtr->name(); } // copy constructor, housePtr should be same type as rhs housePtr Person(const Person& rhs) { housePtr = rhs.housePtr != nullptr ? rhs.housePtr->clone() : nullptr; } }; struct GlassHouse : public House { virtual House* clone() { return new GlassHouse; } virtual string name() { return "GlassHouse"; } }; struct BrickHouse : public House { virtual House* clone() { return new BrickHouse; } virtual string name() { return "BrickHouse"; } }; int main(void) { GlassHouse gh; BrickHouse bh; Person a; a.assignHouse(&gh); Person b(a); cout << a.houseName() << endl; cout << b.houseName() << endl; Person c; c.assignHouse(&bh); Person d(c); cout << c.houseName() << endl; cout << d.houseName() << endl; Person e; Person f(e); cout << e.houseName() << endl; cout << f.houseName() << endl; }