#include <iostream>
#include <string>
using namespace std;
class Pet
{
protected:
string type;
string name;
public:
Pet(const string& arg1, const string& arg2);
virtual void whoAmI() const;
virtual string speak() const = 0;
};
Pet::Pet(const string& arg1, const string& arg2): type(arg1), name(arg2)
{}
void Pet::whoAmI() const
{
cout << "I am an excellent " << type << " and you may refer to me as " << name << endl;
}
class Dog : public Pet
{
public:
using Pet::Pet;
void whoAmI() const override { std::cout << "Dog::whoAmI\n";} // override the describe() function
string speak() const override;
};
string Dog::speak() const
{
return "Arf!";
}
class Cat : public Pet
{
public:
using Pet::Pet;
string speak() const override;
// Do not override the whoAmI() function
};
string Cat::speak() const
{
return "Meow!";
}
ostream& operator<<(ostream& out, const Pet& p)
{
p.whoAmI();
out << "I say " << p.speak();
return out;
}
int main()
{
Dog spot("dog","Spot");
Cat socks("cat","Socks");
Pet* ptr = &spot;
cout << *ptr << endl;
ptr = &socks;
cout << *ptr << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIFBldAp7CnByb3RlY3RlZDoKICAgIHN0cmluZyB0eXBlOwogICAgc3RyaW5nIG5hbWU7CnB1YmxpYzoKICAgIFBldChjb25zdCBzdHJpbmcmIGFyZzEsIGNvbnN0IHN0cmluZyYgYXJnMik7CiAgICB2aXJ0dWFsIHZvaWQgd2hvQW1JKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHN0cmluZyBzcGVhaygpIGNvbnN0ID0gMDsKfTsKClBldDo6UGV0KGNvbnN0IHN0cmluZyYgYXJnMSwgY29uc3Qgc3RyaW5nJiBhcmcyKTogdHlwZShhcmcxKSwgbmFtZShhcmcyKQoKCnt9CnZvaWQgUGV0Ojp3aG9BbUkoKSBjb25zdAp7CiAgICBjb3V0IDw8ICJJIGFtIGFuIGV4Y2VsbGVudCAiIDw8IHR5cGUgPDwgIiBhbmQgeW91IG1heSByZWZlciB0byBtZSBhcyAiIDw8IG5hbWUgPDwgZW5kbDsKfQoKY2xhc3MgRG9nIDogcHVibGljIFBldAp7CnB1YmxpYzoKICAgIHVzaW5nIFBldDo6UGV0OwogICAgdm9pZCB3aG9BbUkoKSBjb25zdCBvdmVycmlkZSB7IHN0ZDo6Y291dCA8PCAiRG9nOjp3aG9BbUlcbiI7fSAgLy8gb3ZlcnJpZGUgdGhlIGRlc2NyaWJlKCkgZnVuY3Rpb24KICAgIHN0cmluZyBzcGVhaygpIGNvbnN0IG92ZXJyaWRlOwoKfTsKCnN0cmluZyBEb2c6OnNwZWFrKCkgY29uc3QKewogICAgcmV0dXJuICJBcmYhIjsKfQoKY2xhc3MgQ2F0IDogcHVibGljIFBldAp7CnB1YmxpYzoKICAgIHVzaW5nIFBldDo6UGV0OwoKICAgIHN0cmluZyBzcGVhaygpIGNvbnN0IG92ZXJyaWRlOwogICAgLy8gRG8gbm90IG92ZXJyaWRlIHRoZSB3aG9BbUkoKSBmdW5jdGlvbgp9OwoKc3RyaW5nIENhdDo6c3BlYWsoKSBjb25zdAp7CiAgICByZXR1cm4gIk1lb3chIjsKfQoKb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBvdXQsIGNvbnN0IFBldCYgcCkKewogICAgcC53aG9BbUkoKTsKICAgIG91dCA8PCAiSSBzYXkgIiA8PCBwLnNwZWFrKCk7CiAgICByZXR1cm4gb3V0Owp9CgppbnQgbWFpbigpCnsKICAgIERvZyBzcG90KCJkb2ciLCJTcG90Iik7CiAgICBDYXQgc29ja3MoImNhdCIsIlNvY2tzIik7CiAgICBQZXQqIHB0ciA9ICZzcG90OwogICAgY291dCA8PCAqcHRyIDw8IGVuZGw7CiAgICBwdHIgPSAmc29ja3M7CiAgICBjb3V0IDw8ICpwdHIgPDwgZW5kbDsKfQo=