通过虚函数表访问private成员

本文通过一个具体的C++示例介绍了如何通过虚函数表访问对象的布局,并演示了单继承场景下对象成员的访问过程。该示例包括了虚函数的使用、对象内存布局的解析及其实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过虚函数表可以访问到对象的布局,通过函数指针可以运行函数,不论是private还是public,于是单继承、非virtual的demo如下:

  1. #include <iostream>
  2.  
  3. class A
  4. {
  5. public:
  6.         A ( ): x ( 5 ) { }
  7.  
  8. private:
  9.         virtual void fun ( ) { std:: cout << "A::fun()" << std:: endl; }
  10.  
  11. private:
  12.         int x;
  13. };
  14.  
  15. class B: public A
  16. {
  17. public:
  18.         B ( ): y ( 3 ) { }
  19.  
  20. private:
  21.         virtual void fun ( ) { std:: cout << "B::fun()" << std:: endl; }
  22.  
  23. private:
  24.         int y;
  25. };
  26.  
  27. typedef void (*Fun ) ( );
  28.  
  29. void PrintVTable (Fun* pVT )
  30. {
  31.         Fun* pFun = pVT;
  32.         while ( *pFun )
  33.         {
  34.                 (*pFun ) ( );
  35.                 pFun ++;
  36.         }
  37. }
  38.  
  39. void PrintMembers ( int* pMembers )
  40. {
  41.         std:: cout << *pMembers << std:: endl;
  42. }
  43.  
  44. void PrintVTableAndMembers (B* ptr )
  45. {
  46.         int* pAddress = ( int* ) ptr;
  47.         PrintVTable ( (Fun* ) *pAddress );
  48.         pAddress ++;
  49.  
  50.         PrintMembers (pAddress );
  51.         pAddress ++;
  52.  
  53.         PrintMembers (pAddress );
  54.         pAddress ++;
  55. }
  56.  
  57. void main ( void )
  58. {
  59.         B b;
  60.  
  61.         PrintVTableAndMembers (&b );
  62.  
  63.         system ( "pause" );
  64. }

如果是多继承 或者 继承方式用virtual,对象的布局是不一样的,可以参考下本文:http://yoyo.is-programmer.com/posts/10671.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值