#include <iostream>
class CBase
{
public:
virtual void fn() = 0;
};
class CX
{
public:
virtual void xx()
{
std::cout << "CX" << std::endl;
};
};
class C1 : public CBase, CX
{
public:
virtual void fn()
{
std::cout << "C1" << std::endl;
};
};
class C2 : public CX, CBase
{
public:
virtual void fn()
{
std::cout << "C2" << std::endl;
};
};
class Hoge
{
public:
C1 member1;
C2 member2;
};
int main()
{
{
C1 Hoge::*pm1 = &Hoge::member1;
C2 Hoge::*pm2 = &Hoge::member2;
Hoge hoge;
(&hoge->*pm1).fn(); // C1
(&hoge->*pm2).fn(); // C2
}
{
CBase Hoge::*pm1 = reinterpret_cast<CBase Hoge::*>(&Hoge::member1);
CBase Hoge::*pm2 = reinterpret_cast<CBase Hoge::*>(&Hoge::member2);
Hoge hoge;
(&hoge->*pm1).fn(); // C1
(&hoge->*pm2).fn(); // CX ... oops! called CX::xx
}
{
CBase Hoge::*pm1 = reinterpret_cast<CBase Hoge::*>(&Hoge::member1);
CBase Hoge::*pm2 = reinterpret_cast<CBase Hoge::*>(&Hoge::member2);
Hoge hoge;
(&hoge->*(reinterpret_cast<C1 Hoge::*>(pm1))).fn(); // C1
(&hoge->*(reinterpret_cast<C2 Hoge::*>(pm2))).fn(); // C2
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgQ0Jhc2UKewpwdWJsaWM6CiAgICB2aXJ0dWFsIHZvaWQgZm4oKSA9IDA7Cn07CgpjbGFzcyBDWAp7CnB1YmxpYzoKICAgIHZpcnR1YWwgdm9pZCB4eCgpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJDWCIgPDwgc3RkOjplbmRsOwogICAgfTsKfTsKCmNsYXNzIEMxIDogcHVibGljIENCYXNlLCBDWAp7CnB1YmxpYzoKICAgIHZpcnR1YWwgdm9pZCBmbigpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJDMSIgPDwgc3RkOjplbmRsOwogICAgfTsKfTsKCmNsYXNzIEMyIDogcHVibGljIENYLCBDQmFzZQp7CnB1YmxpYzoKICAgIHZpcnR1YWwgdm9pZCBmbigpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJDMiIgPDwgc3RkOjplbmRsOwogICAgfTsKfTsKCmNsYXNzIEhvZ2UKewpwdWJsaWM6CiAgICBDMSBtZW1iZXIxOwogICAgQzIgbWVtYmVyMjsKfTsKCmludCBtYWluKCkKewogICAgewogICAgICAgIEMxIEhvZ2U6OipwbTEgPSAmSG9nZTo6bWVtYmVyMTsKICAgICAgICBDMiBIb2dlOjoqcG0yID0gJkhvZ2U6Om1lbWJlcjI7CgogICAgICAgIEhvZ2UgaG9nZTsKICAgICAgICAoJmhvZ2UtPipwbTEpLmZuKCk7IC8vIEMxCiAgICAgICAgKCZob2dlLT4qcG0yKS5mbigpOyAvLyBDMgogICAgfQoKICAgIHsKICAgICAgICBDQmFzZSBIb2dlOjoqcG0xID0gcmVpbnRlcnByZXRfY2FzdDxDQmFzZSBIb2dlOjoqPigmSG9nZTo6bWVtYmVyMSk7CiAgICAgICAgQ0Jhc2UgSG9nZTo6KnBtMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0Jhc2UgSG9nZTo6Kj4oJkhvZ2U6Om1lbWJlcjIpOwoKICAgICAgICBIb2dlIGhvZ2U7CiAgICAgICAgKCZob2dlLT4qcG0xKS5mbigpOyAvLyBDMQogICAgICAgICgmaG9nZS0+KnBtMikuZm4oKTsgLy8gQ1ggLi4uIG9vcHMhIGNhbGxlZCBDWDo6eHgKICAgIH0KCiAgICB7CiAgICAgICAgQ0Jhc2UgSG9nZTo6KnBtMSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0Jhc2UgSG9nZTo6Kj4oJkhvZ2U6Om1lbWJlcjEpOwogICAgICAgIENCYXNlIEhvZ2U6OipwbTIgPSByZWludGVycHJldF9jYXN0PENCYXNlIEhvZ2U6Oio+KCZIb2dlOjptZW1iZXIyKTsKCiAgICAgICAgSG9nZSBob2dlOwogICAgICAgICgmaG9nZS0+KihyZWludGVycHJldF9jYXN0PEMxIEhvZ2U6Oio+KHBtMSkpKS5mbigpOyAvLyBDMQogICAgICAgICgmaG9nZS0+KihyZWludGVycHJldF9jYXN0PEMyIEhvZ2U6Oio+KHBtMikpKS5mbigpOyAvLyBDMgogICAgfQoKICAgIHJldHVybiAwOwp9Cg==