菱形继承

Posted mini-coconut

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了菱形继承相关的知识,希望对你有一定的参考价值。

菱形继承

技术分享图片

主要出现在多重继承中。经常会出现的问题就是二义性。

//Animal类对应于图表的类A 
                            
class Animal { /* ... */ }; // 基类  
{  
int weight;  
  
public:  
  
int getWeight() { return weight;};  
  
};  
  
class Tiger : public Animal { /* ... */ };  
  
class Lion : public Animal { /* ... */ }      
                          
class Liger : public Tiger, public Lion { /* ... */ };  

上述代码中,老虎类和狮子类继承于动物这个基类,但是狮虎兽这个类同时继承于老虎类和狮子类,那么当出现下面的代码就会出现编译错误

int main( )  
{  
Liger lg ;  
  
/*编译错误,下面的代码不会被任何C++编译器通过 */   
int weight = lg.getWeight();    
}  

因为编译器不知道该调用哪个父类的getWeight()函数,Liger多重继承了Tiger和Lion类,因此Liger类会有两份Animal类的成员(数据和方法),Liger对象"lg"会包含Animal基类的两个子对象。

所以,你会问Liger对象有两个Animal基类的子对象会出现什么问题?再看看上面的代码-调用"lg.getWeight()"将会导致一个编译错误。这是因为编译器并不知道是调用Tiger类的getWeight()还是调用Lion类的getWeight()。所以,调用getWeight方法是不明确的,因此不能通过编译。

解决上述问题的方法一个是加限定符,另外一个是用虚继承的方式,如果Lion类和Tiger类在分别继承Animal类时都用virtual来标注,对于每一个Liger对象,C++会保证只有一个Animal类的子对象会被创建。

以上是关于菱形继承的主要内容,如果未能解决你的问题,请参考以下文章

面向对象概论之继承简述,组合简述,菱形继承简述

面试中常被问到(26)菱形继承及解决方法

关于动态转换和(菱形)继承

C++:继承(继承的概念和性质,赋值兼容规则,菱形继承和虚拟继承)

C++进阶第十五篇—C++中的继承(继承的概念+菱形继承+虚拟继承+组合)

继承的作用和菱形问题