• 菱形继承


    菱形继承

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

    //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类的子对象会被创建。

  • 相关阅读:
    在JS和.NET中使用JSON (以及使用Linq to JSON定制JSON数据)
    转载JSON格式化工具
    bzoj3771 Triple
    hdu 2082 找单词
    bzoj 3143: [Hnoi2013]游走
    Wannafly挑战赛17 B
    基尔霍夫矩阵
    矩阵&行列式
    luogu P2421 [NOI2002]荒岛野人
    bzoj 2818: Gcd
  • 原文地址:https://www.cnblogs.com/mini-coconut/p/9499211.html
Copyright © 2020-2023  润新知