#include <iostream>
using namespace std;
class A
{
public:
virtual int Test(int) { cout << "A::Test:" << this << endl; return 9487; };
virtual int Same() = 0;
virtual ~A() {}
};
class B
{
public:
virtual int Test(float) { cout << "B::Test:" << this << endl; return 94.87f; };
virtual int Same() = 0;
virtual ~B() {}
};
class C : public A, public B
{
public:
virtual int Test(int) override { cout << "C::Test int:" << this << endl; return 9487; }
virtual int Test(float) override { cout << "C::Test float: " << this << endl; return 1.1f; }
int Same() override { cout << this << endl; return 5566; }
};
int main() {
C* ptr = new C;
cout << "((A*)ptr):" << ((A*)ptr) << endl;
cout << "((B*)ptr):" << ((B*)ptr) << endl;
ptr->A::Test(1);
ptr->B::Test(2.2f);
((A*)ptr)->Test(1);
((B*)ptr)->Test(2.2f);
void* ptrA = ((A*)ptr);
void* ptrB = ((B*)ptr);
((A*)ptrA)->Test(1);
((B*)ptrB)->Test(2.2f);
((B*)ptrA)->Test(2.2f);
((A*)ptrA)->Same();
((B*)ptrB)->Same();
((B*)ptrA)->Same();
ptr->Same();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjbGFzcyBBCnsKcHVibGljOgogIHZpcnR1YWwgaW50IFRlc3QoaW50KSB7IGNvdXQgPDwgIkE6OlRlc3Q6IiA8PCB0aGlzIDw8IGVuZGw7IHJldHVybiA5NDg3OyB9OwogIHZpcnR1YWwgaW50IFNhbWUoKSA9IDA7CiAgdmlydHVhbCB+QSgpIHt9Cn07CmNsYXNzIEIKewpwdWJsaWM6CiAgdmlydHVhbCBpbnQgVGVzdChmbG9hdCkgeyBjb3V0IDw8ICJCOjpUZXN0OiIgPDwgdGhpcyA8PCBlbmRsOyByZXR1cm4gOTQuODdmOyB9OwogIHZpcnR1YWwgaW50IFNhbWUoKSA9IDA7CiAgdmlydHVhbCB+QigpIHt9Cn07CmNsYXNzIEMgOiBwdWJsaWMgQSwgcHVibGljIEIKewpwdWJsaWM6CiAgdmlydHVhbCBpbnQgVGVzdChpbnQpIG92ZXJyaWRlIHsgY291dCA8PCAiQzo6VGVzdCBpbnQ6IiA8PCB0aGlzIDw8IGVuZGw7IHJldHVybiA5NDg3OyB9CiAgdmlydHVhbCBpbnQgVGVzdChmbG9hdCkgb3ZlcnJpZGUgeyBjb3V0IDw8ICJDOjpUZXN0IGZsb2F0OiAiIDw8IHRoaXMgPDwgZW5kbDsgcmV0dXJuIDEuMWY7IH0KICBpbnQgU2FtZSgpIG92ZXJyaWRlIHsgY291dCA8PCB0aGlzIDw8IGVuZGw7ICByZXR1cm4gNTU2NjsgfQoKfTsKaW50IG1haW4oKSB7CiAgQyogcHRyID0gbmV3IEM7CiAgY291dCA8PCAiKChBKilwdHIpOiIgPDwgKChBKilwdHIpIDw8IGVuZGw7CiAgY291dCA8PCAiKChCKilwdHIpOiIgPDwgKChCKilwdHIpIDw8IGVuZGw7CiAgcHRyLT5BOjpUZXN0KDEpOwogIHB0ci0+Qjo6VGVzdCgyLjJmKTsKICAoKEEqKXB0ciktPlRlc3QoMSk7CiAgKChCKilwdHIpLT5UZXN0KDIuMmYpOwoKICB2b2lkKiBwdHJBID0gKChBKilwdHIpOwogIHZvaWQqIHB0ckIgPSAoKEIqKXB0cik7CiAgKChBKilwdHJBKS0+VGVzdCgxKTsKICAoKEIqKXB0ckIpLT5UZXN0KDIuMmYpOwogICgoQiopcHRyQSktPlRlc3QoMi4yZik7CiAgKChBKilwdHJBKS0+U2FtZSgpOwogICgoQiopcHRyQiktPlNhbWUoKTsKICAoKEIqKXB0ckEpLT5TYW1lKCk7CiAgcHRyLT5TYW1lKCk7CiAgcmV0dXJuIDA7Cn0=