#include <iostream>
class A
{
public:
virtual void foo() = 0;
};
class B
{
public:
virtual void foo() = 0;
};
class AA : public A {
public:
virtual void foo() { a_foo(); }
virtual void a_foo() = 0;
};
class BB : public B {
public:
virtual void foo() { b_foo(); }
virtual void b_foo() = 0;
};
class C : public AA, public BB
{
public:
virtual void a_foo();
virtual void b_foo();
};
void C::a_foo() { std::cout<<"C::a_foo"<<std::endl; }
void C::b_foo() { std::cout<<"C::b_foo"<<std::endl; }
void C::A::foo() { std::cout<<"C::A::foo"<<std::endl; }
void C::B::foo() { std::cout<<"C::B::foo"<<std::endl; }
int main()
{
C c;
A* pa = &c;
B* pb = &c;
c.a_foo();
c.b_foo();
c.A::foo();
c.B::foo();
pa->foo();
pb->foo();
pa->A::foo();
pb->B::foo();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgogCmNsYXNzIEEKewpwdWJsaWM6CiAgICB2aXJ0dWFsIHZvaWQgZm9vKCkgPSAwOwp9OwogCmNsYXNzIEIKewpwdWJsaWM6CiAgICB2aXJ0dWFsIHZvaWQgZm9vKCkgPSAwOwp9OwogCmNsYXNzIEFBIDogcHVibGljIEEgewpwdWJsaWM6CiAgICB2aXJ0dWFsIHZvaWQgZm9vKCkgeyBhX2ZvbygpOyB9CiAgICB2aXJ0dWFsIHZvaWQgYV9mb28oKSA9IDA7Cn07CiAKY2xhc3MgQkIgOiBwdWJsaWMgQiB7CnB1YmxpYzoKICAgIHZpcnR1YWwgdm9pZCBmb28oKSB7IGJfZm9vKCk7IH0KICAgIHZpcnR1YWwgdm9pZCBiX2ZvbygpID0gMDsKfTsKIApjbGFzcyBDIDogcHVibGljIEFBLCBwdWJsaWMgQkIKewpwdWJsaWM6CiAgICB2aXJ0dWFsIHZvaWQgYV9mb28oKTsKICAgIHZpcnR1YWwgdm9pZCBiX2ZvbygpOwp9OwogCnZvaWQgQzo6YV9mb28oKSAgeyBzdGQ6OmNvdXQ8PCJDOjphX2ZvbyI8PHN0ZDo6ZW5kbDsgfQp2b2lkIEM6OmJfZm9vKCkgIHsgc3RkOjpjb3V0PDwiQzo6Yl9mb28iPDxzdGQ6OmVuZGw7IH0Kdm9pZCBDOjpBOjpmb28oKSB7IHN0ZDo6Y291dDw8IkM6OkE6OmZvbyI8PHN0ZDo6ZW5kbDsgfQp2b2lkIEM6OkI6OmZvbygpIHsgc3RkOjpjb3V0PDwiQzo6Qjo6Zm9vIjw8c3RkOjplbmRsOyB9CiAKaW50IG1haW4oKQp7CiAgICBDIGM7CiAgICBBKiBwYSA9ICZjOwogICAgQiogcGIgPSAmYzsKIAogICAgYy5hX2ZvbygpOwogICAgYy5iX2ZvbygpOwogICAgYy5BOjpmb28oKTsKICAgIGMuQjo6Zm9vKCk7CiAgICBwYS0+Zm9vKCk7CiAgICBwYi0+Zm9vKCk7CiAgICBwYS0+QTo6Zm9vKCk7CiAgICBwYi0+Qjo6Zm9vKCk7Cn0=