#include <cstdio>
#include <memory>
struct Animal { virtual void sayHello() = 0; };
template<typename...> struct Dog; //forward decl.
//template to defer compilation of func body
template<typename...> struct Cat : Animal {
void sayHello() { printf("I am a Cat!\n"); new(this) Dog<>; }
};
template<typename...> struct Dog : Animal {
void sayHello() { printf("I am a Dog!\n"); new(this) Cat<>; }
};
int main() {
Cat<> cat;
Animal& animal = cat;
animal.sayHello(); //I am a Cat
animal.sayHello(); //I am a Dog
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPG1lbW9yeT4KCnN0cnVjdCBBbmltYWwgeyB2aXJ0dWFsIHZvaWQgc2F5SGVsbG8oKSA9IDA7IH07IAoKdGVtcGxhdGU8dHlwZW5hbWUuLi4+IHN0cnVjdCBEb2c7IC8vZm9yd2FyZCBkZWNsLgoKLy90ZW1wbGF0ZSB0byBkZWZlciBjb21waWxhdGlvbiBvZiBmdW5jIGJvZHkKdGVtcGxhdGU8dHlwZW5hbWUuLi4+IHN0cnVjdCBDYXQgOiBBbmltYWwgeyAKICAgIHZvaWQgc2F5SGVsbG8oKSB7IHByaW50ZigiSSBhbSBhIENhdCFcbiIpOyBuZXcodGhpcykgRG9nPD47IH0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lLi4uPiBzdHJ1Y3QgRG9nIDogQW5pbWFsIHsgCiAgICB2b2lkIHNheUhlbGxvKCkgeyBwcmludGYoIkkgYW0gYSBEb2chXG4iKTsgbmV3KHRoaXMpIENhdDw+OyB9Cn07CgppbnQgbWFpbigpIHsKICAgIENhdDw+IGNhdDsKICAgIEFuaW1hbCYgYW5pbWFsID0gY2F0OwogICAgCiAgICBhbmltYWwuc2F5SGVsbG8oKTsgLy9JIGFtIGEgQ2F0CiAgICBhbmltYWwuc2F5SGVsbG8oKTsgLy9JIGFtIGEgRG9nCiAgICAKICAgIHJldHVybiAwOwp9Cg==