c – 从V-table调用虚函数
发布时间:2020-12-16 04:57:24 所属栏目:百科 来源:网络整理
导读:因为C中的所有虚函数都存储在V表中.在虚函数的情况下发生重叠. 我想问一下,我们可以通过哪种方式直接从表中调用虚函数,并且能够确定V-table包含哪些函数. 解决方法 嗯,实际上你可以.我不关心可移植性,但在VS中你可以做到. 假设我们使用VS构建32位代码,对象地
因为C中的所有虚函数都存储在V表中.在虚函数的情况下发生重叠.
我想问一下,我们可以通过哪种方式直接从表中调用虚函数,并且能够确定V-table包含哪些函数. 解决方法
嗯,实际上你可以.我不关心可移植性,但在VS中你可以做到.
假设我们使用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; } 附:我不会问为什么你这样做,但在这里你有一个选择:-) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |