c – 从V-table调用虚函数

前端之家收集整理的这篇文章主要介绍了c – 从V-table调用虚函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
因为C中的所有虚函数都存储在V表中.在虚函数的情况下发生重叠.
我想问一下,我们可以通过哪种方式直接从表中调用函数,并且能够确定V-table包含哪些函数.

解决方法

嗯,实际上你可以.我不关心可移植性,但在VS中你可以做到.
假设我们使用VS构建32位代码,对象地址的前4个字节是vtable地址.通过查看头文件,我们知道vtable中方法的顺序.

例:

  1. class Base
  2. {
  3. public:
  4.  
  5. virtual void printMessage()
  6. {
  7. std::cout << "Base::printMessage()" << std::endl;
  8. }
  9. };
  10.  
  11. class Derived : public Base
  12. {
  13. public:
  14.  
  15. void printMessage()
  16. {
  17. std::cout << "Derived::printMessage()" << std::endl;
  18. }
  19. };
  20.  
  21. int main(int argc,char* argv[])
  22. {
  23. Derived d;
  24.  
  25. unsigned int vtblAddress = *(unsigned int*)&d;
  26.  
  27. typedef void(*pFun)(void*);
  28.  
  29. pFun printFun = (pFun)(*(unsigned int*)(vtblAddress));
  30.  
  31. printFun(&d);
  32.  
  33. return 0;
  34. }

附:我不会问为什么你这样做,但在这里你有一个选择:-)

猜你在找的C&C++相关文章