多重继承的内存分布.doc

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
指针的比较 ?? 再以上面Bottom类继承关系为例讨论,下面这段代码会打印Equal吗? 1?Bottom* b =?new?Bottom();? 2?Right* r = b; 3??????? 4?if(r == b) 5??? printf(Equal!/n); ???先明确下这两个指针实际上是指向不同地址的,r指针实际上在b指针所指地址上偏移8字节,但是,这些C++内部细节不能告诉C++程序员,所以C++编译器在比较r和b时,会把r减去8字节,然后再来比较,所以打印出的值是Equal. 多重继承 (non-virtual)的多重继承。看看下面这个C++类层次结构。 ?1?class?Top ?2?{ ?3?public: ?4????int?a; ?5?}; ?6? ?7?class?Left :?public?Top ?8?{ ?9?public: 10????int?b; 11?}; 12? 13?class?Right :?public?Top 14?{ 15?public: 16????int?c; 17?}; 18? 19?class?Bottom :?public?Left,?public?Right 20?{ 21?public: 22????int?d; 23?}; 24? ??? 用UML表述如下: ????注意到Top类实际上被继承了两次,(这种机制在Eiffel中被称作repeated?inheritance),这就意味着在一个bottom对象中实际上有两个a属性(attributes,可以通过bottom.Left::abottom.Right::a访问)?。 那么Left、Right、Bottom在内存中如何分布的呢?我们先来看看简单的Left和Right内存分布: ?????? [Right 类的布局和Left是一样的,因此我这里就没再画图了。刺猬] ???????Top类,这就意味着下面两个赋值语句: 1?Left* left =?new?Left(); 2?Top* top = left; ???????left和top实际上是指向两个相同的地址,我们可以把Left对象当作一个Top对象(同样也可以把Right对象当Top对象来使用)。但是Botom对象呢?GCC是这样处理的: ???? 但是现在如果我们upcast?一个Bottom指针将会有什么结果??? 1?Bottom* bottom =?new?Bottom(); 2?Left* left = bottom;? ???????这段代码运行正确。这是因为GCC选择的这种内存布局使得我们可以把Bottom对象当作Left对象,它们两者(Left部分)正好相同。但是,如果我们把Bottom对象指针upcast到Right对象呢? 1?Right* right = bottom; ??????如果我们要使这段代码正常工作的话,我们需要调整指针指向Bottom中相应的部分。 ?????通过调整,我们可以用right指针访问Bottom对象,这时Bottom对象表现得就如Right对象。但是bottom和right指针指向了不同的内存地址。最后,我们考虑下: 1?Top* top = bottom; ?????恩,什么结果也没有,这条语句实际上是有歧义(ambiguous)的,编译器会报错: error: `Top is an ambiguous base of `Bottom。其实这两种带有歧义的可能性可以用如下语句加以区分: 1?Top* topL = (Left*) bottom; 2?Top* topR = (Right*) bottom;?? ??这两个赋值语句执行之后,topL和left指针将指向同一个地址,同样topR和right也将指向同一个地址。 虚拟继承 ???Top类的多次继承,我们必须虚拟继承类Top。 ?1?class Top ?2?{ ?3?????public: ?4?????????int?a; ?5?}; ?6? ?7?class Left : virtual public Top ?8?{ ?9?????public: 10?????????int?b; 11?}; 12? 13?class Right : virtual public Top 14?{ 15?????public: 16?????????int?c; 17?}; 18? 19?class Bottom : public Left, public Right 20?{ 21?????public: 22?????????int?d; 23?}; 24? ???上述代码将产生如下的类层次图(其实这可能

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档