#include <iostream>
class A
{
public:
virtual void func() = 0;
};
class B
{
private:
void func1() { std::cout << "func1\n"; };
void func2() { std::cout << "func2\n"; };
public:
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;
{
B::C1 c(b);
doSomeStuff(c);
}
{
B::C2 c(b);
doSomeStuff(c);
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgogICAgIApjbGFzcyBBCnsKcHVibGljOgogICAgdmlydHVhbCB2b2lkIGZ1bmMoKSA9IDA7Cn07CiAgICAgCmNsYXNzIEIKewpwcml2YXRlOgogICAgdm9pZCBmdW5jMSgpIHsgc3RkOjpjb3V0IDw8ICJmdW5jMVxuIjsgfTsKICAgIHZvaWQgZnVuYzIoKSB7IHN0ZDo6Y291dCA8PCAiZnVuYzJcbiI7IH07CgpwdWJsaWM6CiAgICBjbGFzcyBDMSA6IHB1YmxpYyBBCiAgICB7CiAgICBwcml2YXRlOgogICAgICAgIEIgJm1fYjsKICAgIHB1YmxpYzoKICAgICAgICBDMShCICZiKSA6IG1fYihiKSB7fQogICAgICAgIHZvaWQgZnVuYygpIG92ZXJyaWRlIHsgbV9iLmZ1bmMxKCk7IH0KICAgIH07CiAgICAgCiAgICBjbGFzcyBDMiA6IHB1YmxpYyBBCiAgICB7CiAgICBwcml2YXRlOgogICAgICAgIEIgJm1fYjsKICAgIHB1YmxpYzoKICAgICAgICBDMihCICZiKSA6IG1fYihiKSB7fQogICAgICAgIHZvaWQgZnVuYygpIG92ZXJyaWRlIHsgbV9iLmZ1bmMyKCk7IH0KICAgIH07Cn07Cgp2b2lkIGRvU29tZVN0dWZmKEEgJmEpIAp7CiAgICBhLmZ1bmMoKTsKfQogICAgIAppbnQgbWFpbigpCnsKICAgIEIgYjsKICAgICAKICAgIHsKICAgIEI6OkMxIGMoYik7CiAgICBkb1NvbWVTdHVmZihjKTsKICAgIH0KICAgICAKICAgIHsKICAgIEI6OkMyIGMoYik7CiAgICBkb1NvbWVTdHVmZihjKTsKICAgIH0KICAgICAKICAgIHJldHVybiAwOwp9