当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

C++对象筹划及多态实现摸索之虚担当[VC/C++编程]

赞助商链接



  本文“C++对象筹划及多态实现摸索之虚担当[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

下面我们来看虚担当.首先看看这C020类,它从C010虚担当:}

struct C010
{
 C010() : c_(0x01) {}
 void foo() { c_ = 0x02; }
 char c_;
};
struct C020 : public virtual C010
{
 C020() : c_(0x02) {}
 char c_;
};

运行以下代码,查看对象的内存筹划:

PRINT_SIZE_DETAIL(C020)

后果为:

The size of C020 is 6
The detail of C020 is c0 c2 45 00 02 01

很明显对象的起始处是一个指针,然后是子类的成员变量,接下来是父类的成员变量.和从前的谈论差别的是由于利用了虚担当,父类的成员变量被放到了最背面.

运行以下的代码:

C020 c020;
c020.C010::c_ = 0x04;

由于子类中的变量和父类中的变量重名,所以我们必须用这种方法来拜候属于父类的成员变量,普通情形下不需求这种写法.我们看看背面这行代码对应的汇编代码:

0042387E mov eax,dword ptr [ebp+FFFFF82Ch]
00423884 mov ecx,dword ptr [eax+4]
00423887 mov byte ptr [ebp+ecx+FFFFF82Ch],4

前面说过对象的起始是一个指针,第1行指令取到这个指针的值,第2行把这个指针指向的地址后移4字节后的值(做为一个4字节的值)取出来.履行完这句我们看看ecx存放器,可知取出来的值为5.最后一行是真正的赋值指令,它通过在对象的起始处(即[ebp+FFFFF32Ch])加上ecx中的值做偏移值(即5)来得到赋值的目的地址.接合前面的对象筹划输出,我们可以发现从对象起始地址开始加5字节的偏移值,刚好得到父类的成员变量的地址.这样我们可以大致解析出直接虚担当的子类的对象筹划.


  以上是“C++对象筹划及多态实现摸索之虚担当[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: 与您的QQ/BBS好友分享!
  • 好的评价 如果您觉得此文章好,就请您
      0%(0)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .