2、+类层次结构。 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类实际上被继承了两次,(这种
3、机制在Eiffel中被称作repeated inheritance),这就意味着在一个bottom对象中实际上有两个a属性(attributes,可以通过bottom.Left::a和 bottom.Right::a访问) 。那么Left、Right、Bottom在内存中如何分布的呢?我们先来看看简单的Left和Right内存分布: [Right类的布局和Left是一样的,因此我这里就没再画图了。刺猬] 注意到上面类各自的第一个属性都是继承自Top类,这就意味着下面两个赋值语句:1 Left*left= new Left();2 Top*t
4、op=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对象指针u