#include <iostream>
struct Base
{
virtual void Serialize(std::ostream &os) const
{
os << "Base";
}
};
struct Derived : Base
{
virtual void Serialize(std::ostream &os) const override
{
os << "Derived, ";
Base::Serialize(os);
}
};
//...
std::ostream &operator<<(std::ostream &os, Base const &b)
{
b.Serialize(os);
return os;
}
//...
int main()
{
Base b;
Derived d;
Base &bd = d;
std::cout << b << std::endl;
std::cout << d << std::endl;
std::cout << bd << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgpzdHJ1Y3QgQmFzZQp7CiAgICB2aXJ0dWFsIHZvaWQgU2VyaWFsaXplKHN0ZDo6b3N0cmVhbSAmb3MpIGNvbnN0CiAgICB7CiAgICAgICAgb3MgPDwgIkJhc2UiOwogICAgfQp9OwoKc3RydWN0IERlcml2ZWQgOiBCYXNlCnsKICAgIHZpcnR1YWwgdm9pZCBTZXJpYWxpemUoc3RkOjpvc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGUKICAgIHsKICAgICAgICBvcyA8PCAiRGVyaXZlZCwgIjsKICAgICAgICBCYXNlOjpTZXJpYWxpemUob3MpOwogICAgfQp9OwoKLy8uLi4KCnN0ZDo6b3N0cmVhbSAmb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm9zLCBCYXNlIGNvbnN0ICZiKQp7CiAgICBiLlNlcmlhbGl6ZShvcyk7CiAgICByZXR1cm4gb3M7Cn0KCi8vLi4uCgppbnQgbWFpbigpCnsKICAgIEJhc2UgYjsKICAgIERlcml2ZWQgZDsKICAgIEJhc2UgJmJkID0gZDsKICAgIHN0ZDo6Y291dCA8PCBiIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCBkIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCBiZCA8PCBzdGQ6OmVuZGw7Cn0K