日期:2011-03-22 13:55:00 来源:本站整理
C++对象筹划及多态摸索之菱形构造虚担当[VC/C++编程]
本文“C++对象筹划及多态摸索之菱形构造虚担当[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
这次我们看看菱形构造的虚担当.虚担当的引入本就是为了办理复杂构造的担当体系问题.上一篇我们在谈论虚担当时用的是一个简单的担当构造,只是为了打个铺垫.
我们先看看这几个类,这是一个典型的菱形担当构造.C100和C101通过虚担当同享同一个父类C041.C110则从C100和C101多重担当而来.
struct C041
{
C041() : c_(0x01) {}
virtual void foo() { c_ = 0x02; }
char c_;
};
struct C100 : public virtual C041
{
C100() : c_(0x02) {}
char c_;
};
struct C101 : public virtual C041
{
C101() : c_(0x03) {}
char c_;
};
struct C110 : public C100, public C101
{
C110() : c_(0x04) {}
char c_;
};
运行以下代码:
PRINT_SIZE_DETAIL(C110)
后果为:
The size of C110 is 16
The detail of C110 is 28 c3 45 00 02 1c c3 45 00 03 04 18 c3 45 00 01
我们可以象上一篇一样,画出对象的内存筹划.
|C100,5 |C101,5 |C110,1 |C041,5 |
|ospt,4,11 |m,1 |ospt,4,6 |m,1 |m,1 |vtpt,4 |m1 |
(注:为了不折行,我用了缩写.ospt代表偏移值指针、m代表成员变量、vtpt代表虚表指针.第一个数字是该区域的大小,即字节数.只有偏移值指针有第二个数字,第二个数字就是偏移值指针指向的偏移值的大小.)
可以看到对象的内存筹划中只有一个C041,即祖父类的部份只有一份,且放在最背面.这就是菱形担当.比较前面几篇的谈论,我们可以知道,假如没有效虚担当机制,那么在C041对象的内存筹划中会呈现两份C041部份,这也就是所谓的V型担当.呼应的对象筹划为:C041+C100+C041+C101 +C110.在V型担当中是不能直接从C110,即孙子类,直接转型到C041,即祖父类的.因为在对象的筹划中有两份祖父类的实体,一份从C100而来,一份从C101而来.编译器在抉择时会存在二义性,它不知道转型后到底用哪一份实体.固然可以通过先转型到某一父类,然后再转型到祖父类来办理.但利用这种办法时,假如改写了祖父类的成员变量的内容,runtime是不会同步两个祖父类实体的状况,因此大概会有语义错误.
以上是“C++对象筹划及多态摸索之菱形构造虚担当[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论