#include <iostream>
// base class
class Animal {
public:
virtual void talk() = 0; // we don't provide any implementation here
virtual ~Animal() {} // destructor must be virtual
};
// derived classes
class Cat: public Animal {
public:
Cat()
{
std::cout << "I want Whiskas!" << std::endl;
}
~Cat()
{
std::cout << "Meooooooouuuchhh!" << std::endl;
}
void talk()
{
std::cout << "Meow!" << std::endl;
}
};
class Dog: public Animal {
public:
Dog()
{
std::cout << "I want Pedigree!" << std::endl;
}
~Dog()
{
std::cout << "Woooooaaaaaaaaaargghhhh!" << std::endl;
}
void talk()
{
std::cout << "Woof!" << std::endl;
}
};
class Human: public Animal {
public:
Human()
{
std::cout << "I want pizza!" << std::endl;
}
~Human()
{
std::cout << "Yahooooowl!" << std::endl;
}
void talk()
{
std::cout << "Hello!" << std::endl;
}
};
int main()
{
Animal *zoo[3];
zoo[0] = new Cat;
zoo[1] = new Dog;
zoo[2] = new Human;
zoo[0]->talk();
zoo[1]->talk();
zoo[2]->talk();
delete zoo[0];
delete zoo[1];
delete zoo[2];
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKLy8gYmFzZSBjbGFzcwpjbGFzcyBBbmltYWwgewpwdWJsaWM6Cgl2aXJ0dWFsIHZvaWQgdGFsaygpID0gMDsgLy8gd2UgZG9uJ3QgcHJvdmlkZSBhbnkgaW1wbGVtZW50YXRpb24gaGVyZQoJdmlydHVhbCB+QW5pbWFsKCkge30gLy8gZGVzdHJ1Y3RvciBtdXN0IGJlIHZpcnR1YWwKfTsKCi8vIGRlcml2ZWQgY2xhc3NlcwpjbGFzcyBDYXQ6IHB1YmxpYyBBbmltYWwgewpwdWJsaWM6CglDYXQoKQoJewoJCXN0ZDo6Y291dCA8PCAiSSB3YW50IFdoaXNrYXMhIiA8PCBzdGQ6OmVuZGw7Cgl9CgoJfkNhdCgpCgl7CgkJc3RkOjpjb3V0IDw8ICJNZW9vb29vb291dXVjaGhoISIgPDwgc3RkOjplbmRsOwoJfQoKCXZvaWQgdGFsaygpCgl7CgkJc3RkOjpjb3V0IDw8ICJNZW93ISIgPDwgc3RkOjplbmRsOwoJfQp9OwoKY2xhc3MgRG9nOiBwdWJsaWMgQW5pbWFsIHsKcHVibGljOgoJRG9nKCkKCXsKCQlzdGQ6OmNvdXQgPDwgIkkgd2FudCBQZWRpZ3JlZSEiIDw8IHN0ZDo6ZW5kbDsKCX0KCgl+RG9nKCkKCXsKCQlzdGQ6OmNvdXQgPDwgIldvb29vb2FhYWFhYWFhYWFyZ2doaGhoISIgPDwgc3RkOjplbmRsOwoJfQoKCXZvaWQgdGFsaygpCgl7CgkJc3RkOjpjb3V0IDw8ICJXb29mISIgPDwgc3RkOjplbmRsOwoJfQp9OwoKY2xhc3MgSHVtYW46IHB1YmxpYyBBbmltYWwgewpwdWJsaWM6CglIdW1hbigpCgl7CgkJc3RkOjpjb3V0IDw8ICJJIHdhbnQgcGl6emEhIiA8PCBzdGQ6OmVuZGw7Cgl9CgoJfkh1bWFuKCkKCXsKCQlzdGQ6OmNvdXQgPDwgIllhaG9vb29vd2whIiA8PCBzdGQ6OmVuZGw7Cgl9CgoJdm9pZCB0YWxrKCkKCXsKCQlzdGQ6OmNvdXQgPDwgIkhlbGxvISIgPDwgc3RkOjplbmRsOwoJfQp9OwoKaW50IG1haW4oKQp7CglBbmltYWwgKnpvb1szXTsKCgl6b29bMF0gPSBuZXcgQ2F0OwoJem9vWzFdID0gbmV3IERvZzsKCXpvb1syXSA9IG5ldyBIdW1hbjsKCgl6b29bMF0tPnRhbGsoKTsKCXpvb1sxXS0+dGFsaygpOwoJem9vWzJdLT50YWxrKCk7CgoJZGVsZXRlIHpvb1swXTsKCWRlbGV0ZSB6b29bMV07CglkZWxldGUgem9vWzJdOwp9Cg==