#include <iostream>
struct Animal {
virtual const char* say() { return "???"; }
};
struct Fox : public Animal {
const char* say() override { return "A ring ding ding"; }
};
struct Cat : public Animal {
const char* say() override { return "Meow"; }
};
void whatDoesItSay(const char* name, Animal* animal) {
std::cout << "The " << name << " says " << animal->say() << ".\n";
}
int main() {
Cat cat;
Fox fox;
whatDoesItSay("cat", &cat);
whatDoesItSay("fox", &fox);
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgIAogICAgc3RydWN0IEFuaW1hbCB7CiAgICAgICAgdmlydHVhbCBjb25zdCBjaGFyKiBzYXkoKSB7IHJldHVybiAiPz8/IjsgfQogICAgfTsKCiAgICBzdHJ1Y3QgRm94IDogcHVibGljIEFuaW1hbCB7CiAgICAgICAgY29uc3QgY2hhciogc2F5KCkgb3ZlcnJpZGUgeyByZXR1cm4gIkEgcmluZyBkaW5nIGRpbmciOyB9CiAgICB9OwoKICAgIHN0cnVjdCBDYXQgOiBwdWJsaWMgQW5pbWFsIHsKICAgICAgICBjb25zdCBjaGFyKiBzYXkoKSBvdmVycmlkZSB7IHJldHVybiAiTWVvdyI7IH0KICAgIH07CgogICAgdm9pZCB3aGF0RG9lc0l0U2F5KGNvbnN0IGNoYXIqIG5hbWUsIEFuaW1hbCogYW5pbWFsKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJUaGUgIiA8PCBuYW1lIDw8ICIgc2F5cyAiIDw8IGFuaW1hbC0+c2F5KCkgPDwgIi5cbiI7CiAgICB9CgogICAgaW50IG1haW4oKSB7CiAgICAgICAgQ2F0IGNhdDsKICAgICAgICBGb3ggZm94OwogICAgICAgIHdoYXREb2VzSXRTYXkoImNhdCIsICZjYXQpOwogICAgICAgIHdoYXREb2VzSXRTYXkoImZveCIsICZmb3gpOwogICAgfQo=