64,282
社区成员
发帖
与我相关
我的任务
分享
make
刚打球去了,累死了,呵呵,没能及时回答,还请见谅啊~~~
很碰巧!
实际:
+------------------+
| CB1 |
+------------------+
| CB1::a1(1) | 转换后:
+------------------+ +---------------
| CB2 | | CB1
+------------------+ +-------------------
| CB2::a2(2) | | CB1::a1(从左边读过来,是2)
+------------------+ +------------------
上面这个只是我的一个示例,省略了虚函数所占的字节,实际上:
我重新来解释一下:
首先,setvalue里的this指向的肯定是cb2:vb吧??
这点毫无疑问!
那么对于第一种情况(未去掉CB1::vb)
那么和我上面描述的无差别!
+------------------+
| CB1::vb |
+------------------+
| CB1::a1(1) | 转换后:
+------------------+ +---------------
| CB2::vb | | CB1::vb
+------------------+ +-------------------
| CB2::a2(2) | | CB1::a1(从左边读过来,是2)
+------------------+ +------------------
| CB2::vb
+------------------
| CB2::a2(这里就是未定义的,lz可以试试,不输出a1,输出a2试试,我试了,输出的是a2 = 4334185
+------------------
那么如果把CB2的virtual去掉呢?
情况有变:
现在的内存变为:
转换前: 转换后:
+------------------+ +---------------
| CB2::vb | | CB2::vb
+------------------+ +-------------------
| CB2::a2(2) | | CB2::a2(从左边读过来,是2)
+------------------+ +------------------
| CB1::a1(1) | | CB1::a1(1),此时lz可以输出a1,a2,试试,都对!
因为CB1没有vb,那么我们知道,如果有virtual,就有vb表,那么this指向这个表地址
所以内存的布局变了,变成上面的这样了,开始的不再是CB1,而是CB2
不知道我说明白没?