#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class IA
{
public:
virtual ~IA() {}
void A() { cout << "A" << endl; }
};
class IB
{
public:
virtual ~IB() {}
void B() { cout << "A" << endl; }
};
class IC
{
public:
virtual ~IC() {}
void C() { cout << "A" << endl; }
};
class C : IA, IB, IC
{
public:
};
void QueryInterface(int n, C* cthis, void** ptr)
{
switch (n)
{
case 1:
*ptr = reinterpret_cast<IA*>(cthis);
break;
case 2:
*ptr = reinterpret_cast<IB*>(cthis);
break;
case 3:
*ptr = reinterpret_cast<IC*>(cthis);
break;
}
}
void QueryInterface2(int n, C* cthis, void** ptr)
{
switch (n)
{
case 1:
*ptr = (IA*)cthis;
break;
case 2:
*ptr = (IB*)cthis;
break;
case 3:
*ptr = (IC*)cthis;
break;
}
}
int main() {
IA* ptr;
cout<<"Cpp style cast."<<endl;
C c;
QueryInterface(1, &c, (void**)&ptr);
cout << ptr << endl;
QueryInterface(2, &c, (void**)&ptr);
cout << ptr << endl;
QueryInterface(3, &c, (void**)&ptr);
cout << ptr << endl;
cout<<"C style cast."<<endl;
QueryInterface2(1, &c, (void**)&ptr);
cout << ptr << endl;
QueryInterface2(2, &c, (void**)&ptr);
cout << ptr << endl;
QueryInterface2(3, &c, (void**)&ptr);
cout << ptr << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgSUEKewpwdWJsaWM6Cgl2aXJ0dWFsIH5JQSgpIHt9Cgl2b2lkIEEoKSB7IGNvdXQgPDwgIkEiIDw8IGVuZGw7IH0KfTsKY2xhc3MgSUIKewpwdWJsaWM6Cgl2aXJ0dWFsIH5JQigpIHt9Cgl2b2lkIEIoKSB7IGNvdXQgPDwgIkEiIDw8IGVuZGw7IH0KfTsKY2xhc3MgSUMKewpwdWJsaWM6Cgl2aXJ0dWFsIH5JQygpIHt9Cgl2b2lkIEMoKSB7IGNvdXQgPDwgIkEiIDw8IGVuZGw7IH0KfTsKCmNsYXNzIEMgOiBJQSwgSUIsIElDCnsKcHVibGljOgp9OwoKdm9pZCBRdWVyeUludGVyZmFjZShpbnQgbiwgQyogY3RoaXMsIHZvaWQqKiBwdHIpCnsKCXN3aXRjaCAobikKCXsKCWNhc2UgMToKCQkqcHRyID0gcmVpbnRlcnByZXRfY2FzdDxJQSo+KGN0aGlzKTsKCQlicmVhazsKCWNhc2UgMjoKCQkqcHRyID0gcmVpbnRlcnByZXRfY2FzdDxJQio+KGN0aGlzKTsKCQlicmVhazsKCWNhc2UgMzoKCQkqcHRyID0gcmVpbnRlcnByZXRfY2FzdDxJQyo+KGN0aGlzKTsKCQlicmVhazsKCX0KfQoKdm9pZCBRdWVyeUludGVyZmFjZTIoaW50IG4sIEMqIGN0aGlzLCB2b2lkKiogcHRyKQp7Cglzd2l0Y2ggKG4pCgl7CgljYXNlIDE6CgkJKnB0ciA9IChJQSopY3RoaXM7CgkJYnJlYWs7CgljYXNlIDI6CgkJKnB0ciA9IChJQiopY3RoaXM7CgkJYnJlYWs7CgljYXNlIDM6CgkJKnB0ciA9IChJQyopY3RoaXM7CgkJYnJlYWs7Cgl9Cn0KaW50IG1haW4oKSB7CglJQSogcHRyOwoJY291dDw8IkNwcCBzdHlsZSBjYXN0LiI8PGVuZGw7CglDIGM7CglRdWVyeUludGVyZmFjZSgxLCAmYywgKHZvaWQqKikmcHRyKTsKCWNvdXQgPDwgcHRyIDw8IGVuZGw7CglRdWVyeUludGVyZmFjZSgyLCAmYywgKHZvaWQqKikmcHRyKTsKCWNvdXQgPDwgcHRyIDw8IGVuZGw7CglRdWVyeUludGVyZmFjZSgzLCAmYywgKHZvaWQqKikmcHRyKTsKCWNvdXQgPDwgcHRyIDw8IGVuZGw7CgkKCWNvdXQ8PCJDIHN0eWxlIGNhc3QuIjw8ZW5kbDsKCVF1ZXJ5SW50ZXJmYWNlMigxLCAmYywgKHZvaWQqKikmcHRyKTsKCWNvdXQgPDwgcHRyIDw8IGVuZGw7CglRdWVyeUludGVyZmFjZTIoMiwgJmMsICh2b2lkKiopJnB0cik7Cgljb3V0IDw8IHB0ciA8PCBlbmRsOwoJUXVlcnlJbnRlcmZhY2UyKDMsICZjLCAodm9pZCoqKSZwdHIpOwoJY291dCA8PCBwdHIgPDwgZW5kbDsKCglyZXR1cm4gMDsKfQ==