#include <iostream>
using std::cout;
using std::endl;
struct IB {
virtual void b() = 0;
};
struct B : IB {
void b() override { cout << "B::b" << endl; }
};
struct IA {
virtual void a() = 0;
};
struct A : IA, B {
void a() override { cout << "A::a" << endl; }
};
struct IAB : IA, IB {
IAB(IA *ia, IB *ib) : ia(ia), ib(ib) {}
void a() override { ia->a(); }
void b() override { ib->b(); }
private:
IA *ia;
IB *ib;
};
int main() {
A a;
IAB iab(&a, &a);
iab.a();
iab.b();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBzdGQ6OmNvdXQ7CnVzaW5nIHN0ZDo6ZW5kbDsKCnN0cnVjdCBJQiB7Cgl2aXJ0dWFsIHZvaWQgYigpID0gMDsKfTsKCnN0cnVjdCBCIDogSUIgewoJdm9pZCBiKCkgb3ZlcnJpZGUgeyBjb3V0IDw8ICJCOjpiIiA8PCBlbmRsOyB9Cn07CgpzdHJ1Y3QgSUEgewoJdmlydHVhbCB2b2lkIGEoKSA9IDA7Cn07CgpzdHJ1Y3QgQSA6IElBLCBCIHsKCXZvaWQgYSgpIG92ZXJyaWRlIHsgY291dCA8PCAiQTo6YSIgPDwgZW5kbDsgfQp9OwoKc3RydWN0IElBQiA6IElBLCBJQiB7CglJQUIoSUEgKmlhLCBJQiAqaWIpIDogaWEoaWEpLCBpYihpYikge30KCXZvaWQgYSgpIG92ZXJyaWRlIHsgaWEtPmEoKTsgfQoJdm9pZCBiKCkgb3ZlcnJpZGUgeyBpYi0+YigpOyB9CnByaXZhdGU6CglJQSAqaWE7CglJQiAqaWI7Cn07CgppbnQgbWFpbigpIHsKCUEgYTsKCUlBQiBpYWIoJmEsICZhKTsKCWlhYi5hKCk7CglpYWIuYigpOwp9