- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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?Top14?{15?public:16????int?c;17?};18?19?class?Bottom :?public?Left,?public?Right20?{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 Top14?{15?????public:16?????????int?c;17?};18?19?class Bottom : public Left, public Right20?{21?????public:22?????????int?d;23?};24?
???上述代码将产生如下的类层次图(其实这可能
文档评论(0)