#include <iostream>
struct A {
bool f(A* a) { std::cout << "true "; return true; }
};
struct B : A {
bool f(B* b) { std::cout << "false "; return false; }
};
int main() {
A* a = new A();
A* ab = new B();
B* b = new B();
a->f(a); a->f(ab); a->f(b); // true, true, true
std::cout << std::endl;
ab->f(a); ab->f(ab); ab->f(b); // true, true, true
std::cout << std::endl;
b->A::f(a); b->A::f(ab); b->f(b); // true true false
std::cout << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgpzdHJ1Y3QgQSB7CiAgICBib29sIGYoQSogYSkgeyBzdGQ6OmNvdXQgPDwgInRydWUgIjsgcmV0dXJuIHRydWU7IH0KfTsKc3RydWN0IEIgOiBBIHsKICAgIGJvb2wgZihCKiBiKSB7IHN0ZDo6Y291dCA8PCAiZmFsc2UgIjsgcmV0dXJuIGZhbHNlOyB9Cn07CmludCBtYWluKCkgewogICAgQSogYSA9IG5ldyBBKCk7CiAgICBBKiBhYiA9IG5ldyBCKCk7CiAgICBCKiBiID0gbmV3IEIoKTsKICAgIGEtPmYoYSk7IGEtPmYoYWIpOyBhLT5mKGIpOyAvLyB0cnVlLCB0cnVlLCB0cnVlCiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogICAgYWItPmYoYSk7IGFiLT5mKGFiKTsgYWItPmYoYik7IC8vIHRydWUsIHRydWUsIHRydWUKICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CiAgICBiLT5BOjpmKGEpOyBiLT5BOjpmKGFiKTsgYi0+ZihiKTsgLy8gdHJ1ZSB0cnVlIGZhbHNlCiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwp9