#include <iostream>
class Base
{
private:
int m_value {};
public:
Base(int value)
: m_value{ value }
{
}
friend std::ostream& operator<< (std::ostream& out, const Base& b)
{
out << "In Base\n";
out << b.m_value << '\n';
return out;
}
};
class Derived : public Base
{
public:
Derived(int value)
: Base{ value }
{
}
friend std::ostream& operator<< (std::ostream& out, const Derived& d)
{
out << "In Derived\n";
// static_cast Derived to a Base object, so we call the right version of operator<<
out << static_cast<const Base&>(d);
return out;
}
};
int main()
{
Derived derived { 7 };
std::cout << derived << '\n';
return 0;
}
CiNpbmNsdWRlIDxpb3N0cmVhbT4KCmNsYXNzIEJhc2UKewpwcml2YXRlOgoJaW50IG1fdmFsdWUge307CgpwdWJsaWM6CglCYXNlKGludCB2YWx1ZSkKCQk6IG1fdmFsdWV7IHZhbHVlIH0KCXsKCX0KCglmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8IChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgQmFzZSYgYikKCXsKCQlvdXQgPDwgIkluIEJhc2VcbiI7CgkJb3V0IDw8IGIubV92YWx1ZSA8PCAnXG4nOwoJCXJldHVybiBvdXQ7Cgl9Cn07CgpjbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2UKewpwdWJsaWM6CglEZXJpdmVkKGludCB2YWx1ZSkKCQk6IEJhc2V7IHZhbHVlIH0KCXsKCX0KCglmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8IChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgRGVyaXZlZCYgZCkKCXsKCQlvdXQgPDwgIkluIERlcml2ZWRcbiI7CgkJLy8gc3RhdGljX2Nhc3QgRGVyaXZlZCB0byBhIEJhc2Ugb2JqZWN0LCBzbyB3ZSBjYWxsIHRoZSByaWdodCB2ZXJzaW9uIG9mIG9wZXJhdG9yPDwKCQlvdXQgPDwgc3RhdGljX2Nhc3Q8Y29uc3QgQmFzZSY+KGQpOwoJCXJldHVybiBvdXQ7Cgl9Cn07CgppbnQgbWFpbigpCnsKCURlcml2ZWQgZGVyaXZlZCB7IDcgfTsKCglzdGQ6OmNvdXQgPDwgZGVyaXZlZCA8PCAnXG4nOwoKCXJldHVybiAwOwp9