#include <iostream>
class A
{
public:
virtual void func() = 0;
};
class B
{
public:
void func1() { std::cout << "func1\n"; };
void func2() { std::cout << "func2\n"; };
};
class C1 : public A
{
private:
B &m_b;
public:
C1(B &b) : m_b(b) {}
void func() override { m_b.func1(); }
};
class C2 : public A
{
private:
B &m_b;
public:
C2(B &b) : m_b(b) {}
void func() override { m_b.func2(); }
};
void doSomeStuff(A &a)
{
a.func();
}
int main()
{
B b;
{
C1 c(b);
doSomeStuff(c);
}
{
C2 c(b);
doSomeStuff(c);
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgQQp7CnB1YmxpYzoKICAgIHZpcnR1YWwgdm9pZCBmdW5jKCkgPSAwOwp9OwoKY2xhc3MgQgp7CnB1YmxpYzoKICAgIHZvaWQgZnVuYzEoKSB7IHN0ZDo6Y291dCA8PCAiZnVuYzFcbiI7IH07CiAgICB2b2lkIGZ1bmMyKCkgeyBzdGQ6OmNvdXQgPDwgImZ1bmMyXG4iOyB9Owp9OwoKY2xhc3MgQzEgOiBwdWJsaWMgQQp7CnByaXZhdGU6CiAgICBCICZtX2I7CnB1YmxpYzoKICAgIEMxKEIgJmIpIDogbV9iKGIpIHt9CiAgICB2b2lkIGZ1bmMoKSBvdmVycmlkZSB7IG1fYi5mdW5jMSgpOyB9Cn07CgpjbGFzcyBDMiA6IHB1YmxpYyBBCnsKcHJpdmF0ZToKICAgIEIgJm1fYjsKcHVibGljOgogICAgQzIoQiAmYikgOiBtX2IoYikge30KICAgIHZvaWQgZnVuYygpIG92ZXJyaWRlIHsgbV9iLmZ1bmMyKCk7IH0KfTsKCnZvaWQgZG9Tb21lU3R1ZmYoQSAmYSkgCnsKICAgIGEuZnVuYygpOwp9CgppbnQgbWFpbigpCnsKICAgIEIgYjsKCiAgICB7CiAgICBDMSBjKGIpOwogICAgZG9Tb21lU3R1ZmYoYyk7CiAgICB9CiAgICAKICAgIHsKICAgIEMyIGMoYik7CiAgICBkb1NvbWVTdHVmZihjKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQ==