#include <iostream>
#include <memory>
class Animals
{
public:
virtual void Display() = 0;
virtual ~Animals() = default;
};
class Dog : public Animals
{
void Display() override
{
std::cout << "This is Dog!" << std::endl;
}
};
class Cat : public Animals
{
void Display() override
{
std::cout << "This is Cat!" << std::endl;
}
};
class Goat : public Animals
{
void Display() override
{
std::cout << "This is Goat!" << std::endl;
}
};
int main()
{
Animals* animal = new Dog;
animal->Display();
delete animal; // delete at some point to avoid memory leak as Dog is allocated on the heap
Cat cat;
animal = &cat;
animal->Display(); // no delete needed, as Cat is allocated on the stack and will cleared when goes out of scope
std::unique_ptr<Animals> animal2 = std::make_unique<Goat>();
animal2->Display(); // no delete needed, Goat is allocated on the heap but will be cleared when goes out of scope
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKY2xhc3MgQW5pbWFscwp7CnB1YmxpYzoKCXZpcnR1YWwgdm9pZCBEaXNwbGF5KCkgPSAwOwoJdmlydHVhbCB+QW5pbWFscygpID0gZGVmYXVsdDsKfTsKCmNsYXNzIERvZyA6IHB1YmxpYyBBbmltYWxzCnsKCXZvaWQgRGlzcGxheSgpIG92ZXJyaWRlCgl7CgkJc3RkOjpjb3V0IDw8ICJUaGlzIGlzIERvZyEiIDw8IHN0ZDo6ZW5kbDsKCX0KfTsKCmNsYXNzIENhdCA6IHB1YmxpYyBBbmltYWxzCnsKCXZvaWQgRGlzcGxheSgpIG92ZXJyaWRlCgl7CgkJc3RkOjpjb3V0IDw8ICJUaGlzIGlzIENhdCEiIDw8IHN0ZDo6ZW5kbDsKCX0KfTsKCmNsYXNzIEdvYXQgOiBwdWJsaWMgQW5pbWFscwp7Cgl2b2lkIERpc3BsYXkoKSBvdmVycmlkZQoJewoJCXN0ZDo6Y291dCA8PCAiVGhpcyBpcyBHb2F0ISIgPDwgc3RkOjplbmRsOwoJfQp9OwoKaW50IG1haW4oKQp7CglBbmltYWxzKiBhbmltYWwgPSBuZXcgRG9nOwoJYW5pbWFsLT5EaXNwbGF5KCk7CglkZWxldGUgYW5pbWFsOyAvLyBkZWxldGUgYXQgc29tZSBwb2ludCB0byBhdm9pZCBtZW1vcnkgbGVhayBhcyBEb2cgaXMgYWxsb2NhdGVkIG9uIHRoZSBoZWFwCgoJQ2F0IGNhdDsKCWFuaW1hbCA9ICZjYXQ7CglhbmltYWwtPkRpc3BsYXkoKTsgLy8gbm8gZGVsZXRlIG5lZWRlZCwgYXMgQ2F0IGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2sgYW5kIHdpbGwgY2xlYXJlZCB3aGVuIGdvZXMgb3V0IG9mIHNjb3BlCgoJc3RkOjp1bmlxdWVfcHRyPEFuaW1hbHM+IGFuaW1hbDIgPSBzdGQ6Om1ha2VfdW5pcXVlPEdvYXQ+KCk7CglhbmltYWwyLT5EaXNwbGF5KCk7IC8vIG5vIGRlbGV0ZSBuZWVkZWQsIEdvYXQgaXMgYWxsb2NhdGVkIG9uIHRoZSBoZWFwIGJ1dCB3aWxsIGJlIGNsZWFyZWQgd2hlbiBnb2VzIG91dCBvZiBzY29wZQoKCXJldHVybiAwOwp9