#include<iostream>
using std::cout;
using std::endl;
class B;
typedef void (*HANDLE_DOSOMETHING)(B *const, int q);
class B
{
public:
virtual void doSomething(int q)
{
std::cout<<"B::doSomething()"<<q<<endl;
}
void dummy()
{
HANDLE_DOSOMETHING *f1ptr = NULL;
int *vtbl = NULL;
int *vptr = (int *)this; // address of the object
vtbl = (int *)*vptr; //address of the VTABLE
f1ptr = (HANDLE_DOSOMETHING *)&(vtbl[0]); //address of the 1st virtual function
(*f1ptr)(this, 55);
}
};
int main()
{
B objb;
objb.dummy();
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CnVzaW5nIHN0ZDo6Y291dDsKdXNpbmcgc3RkOjplbmRsOwoKY2xhc3MgQjsKdHlwZWRlZiB2b2lkICgqSEFORExFX0RPU09NRVRISU5HKShCICpjb25zdCwgaW50IHEpOwoKY2xhc3MgQgp7CnB1YmxpYzoKICB2aXJ0dWFsIHZvaWQgZG9Tb21ldGhpbmcoaW50IHEpCiAgewogICAgICBzdGQ6OmNvdXQ8PCJCOjpkb1NvbWV0aGluZygpIjw8cTw8ZW5kbDsKICB9CiAgdm9pZCBkdW1teSgpCiAgewogICAgICBIQU5ETEVfRE9TT01FVEhJTkcgKmYxcHRyID0gTlVMTDsKICAgICAgaW50ICAgICAgICAgICAgICAgICp2dGJsICA9IE5VTEw7CiAgICAgIGludCAgICAgICAgICAgICAgICAqdnB0ciAgPSAoaW50ICopdGhpczsgLy8gYWRkcmVzcyBvZiB0aGUgb2JqZWN0CiAgICAgICAgCiAgICAgIHZ0YmwgPSAoaW50ICopKnZwdHI7IC8vYWRkcmVzcyBvZiB0aGUgVlRBQkxFCgogICAgICBmMXB0ciA9IChIQU5ETEVfRE9TT01FVEhJTkcgKikmKHZ0YmxbMF0pOyAvL2FkZHJlc3Mgb2YgdGhlIDFzdCB2aXJ0dWFsIGZ1bmN0aW9uCiAgICAgICgqZjFwdHIpKHRoaXMsIDU1KTsKICAgfQp9OwppbnQgbWFpbigpCnsKICAgIEIgb2JqYjsKICAgIG9iamIuZHVtbXkoKTsKICAgIHJldHVybiAwOyAgCn0=