解决方法
嗯,实际上你可以.我不关心可移植性,但在VS中你可以做到.
假设我们使用VS构建32位代码,对象地址的前4个字节是vtable地址.通过查看头文件,我们知道vtable中方法的顺序.
假设我们使用VS构建32位代码,对象地址的前4个字节是vtable地址.通过查看头文件,我们知道vtable中方法的顺序.
例:
- class Base
- {
- public:
- virtual void printMessage()
- {
- std::cout << "Base::printMessage()" << std::endl;
- }
- };
- class Derived : public Base
- {
- public:
- void printMessage()
- {
- std::cout << "Derived::printMessage()" << std::endl;
- }
- };
- int main(int argc,char* argv[])
- {
- Derived d;
- unsigned int vtblAddress = *(unsigned int*)&d;
- typedef void(*pFun)(void*);
- pFun printFun = (pFun)(*(unsigned int*)(vtblAddress));
- printFun(&d);
- return 0;
- }
附:我不会问为什么你这样做,但在这里你有一个选择:-)