#include <iostream>
class A1 {
public:
virtual void print() const
{
std::cout << "A1::print() called." << std::endl;
}
};
class A2: public A1 {
public:
void print() const override
{
std::cout << "A2::print() called." << std::endl;
}
};
class B1 {
public:
void print() const
{
std::cout << "B1::print() called." << std::endl;
}
};
class B2: public B1 {
public:
void print() const
{
std::cout << "B2::print() called." << std::endl;
}
};
using namespace std;
int main(void)
{
A2 a2;
cout << "Calling a2.print(): ";
a2.print();
A1 &a1 = a2;
cout << "Calling a1.print(): ";
a1.print();
B2 b2;
cout << "Calling b2.print(): ";
b2.print();
B1 &b1 = b2;
cout << "Calling b1.print(): ";
b1.print();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgQTEgewogIHB1YmxpYzoKICB2aXJ0dWFsIHZvaWQgcHJpbnQoKSBjb25zdAogIHsKICAgIHN0ZDo6Y291dCA8PCAiQTE6OnByaW50KCkgY2FsbGVkLiIgPDwgc3RkOjplbmRsOwogIH0KfTsKCmNsYXNzIEEyOiBwdWJsaWMgQTEgewogIHB1YmxpYzoKICB2b2lkIHByaW50KCkgY29uc3Qgb3ZlcnJpZGUKICB7CiAgICBzdGQ6OmNvdXQgPDwgIkEyOjpwcmludCgpIGNhbGxlZC4iIDw8IHN0ZDo6ZW5kbDsKICB9Cn07CgpjbGFzcyBCMSB7CiAgcHVibGljOgogIHZvaWQgcHJpbnQoKSBjb25zdAogIHsKICAgIHN0ZDo6Y291dCA8PCAiQjE6OnByaW50KCkgY2FsbGVkLiIgPDwgc3RkOjplbmRsOwogIH0KfTsKCmNsYXNzIEIyOiBwdWJsaWMgQjEgewogIHB1YmxpYzoKICB2b2lkIHByaW50KCkgY29uc3QKICB7CiAgICBzdGQ6OmNvdXQgPDwgIkIyOjpwcmludCgpIGNhbGxlZC4iIDw8IHN0ZDo6ZW5kbDsKICB9Cn07Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG1haW4odm9pZCkKewogIEEyIGEyOwogIGNvdXQgPDwgIkNhbGxpbmcgYTIucHJpbnQoKTogIjsKICBhMi5wcmludCgpOwogIEExICZhMSA9IGEyOwogIGNvdXQgPDwgIkNhbGxpbmcgYTEucHJpbnQoKTogIjsKICBhMS5wcmludCgpOwogIEIyIGIyOwogIGNvdXQgPDwgIkNhbGxpbmcgYjIucHJpbnQoKTogIjsKICBiMi5wcmludCgpOwogIEIxICZiMSA9IGIyOwogIGNvdXQgPDwgIkNhbGxpbmcgYjEucHJpbnQoKTogIjsKICBiMS5wcmludCgpOwogIHJldHVybiAwOwp9Cg==