C++ 多重集成的優缺點

舉例:現實生活中,許多事物可能有兩個或者兩個以上事物的屬性,爲了描述這種情況,C++引入了多繼承。

允許一個類指向多個基類,這樣繼承的結構叫多重繼承。

 

概念

多重繼承:常規情況,一個類只有一個基類,而C++支持多重繼承,即一個類可以繼承自多個類。

 

人(Person)可以吃飯和睡覺,既可以是作家也可以是程序員,作家可以寫文章,程序員可以寫程序,

即是作家又是程序員的人能夠寫文章和寫程序。

 

 

 

使用多重繼承的例子程序如下:
       #include <iostream>
       using namespace std;
    
       class Person
       {
      public:
                void sleep() {cout << "sleep" << endl;}
                void eat() {cout << "eat" << endl;}
       };
    
     class Author : public Person            //Author繼承自Person
     {
     public:
              void writeBook() {cout << "write Book" << endl;}
     };
    
     class Programmer : public Person      //Programmer繼承自Person
     {
     public:
              void writeCode() {cout << "write Code" << endl;}
     };
    
     class Programmer_Author : public Programmer, public Author    //多重繼承
     {
     };
    
     int main()
     {
              Programmer_Author pa;
    
              pa.writeBook();   //調用基類Author的方法
              pa.writeCode();   //調用基類Programmer的方法
              pa.eat();         //編譯錯誤,eat()定義不明確
              pa.sleep();       //編譯錯誤,sleep()定義不明確
    
              return 0;
     }

   多重繼承的優點很明顯,就是對象可以調用多個基類中的接口,如代碼31行與代碼32行對象pa分別調用Author類的writeBook()函數和Programmer類的writeCode()函數。
       多重繼承的缺點是什麼呢?如果派生類所繼承的多個基類有相同的基類,而派生類對象需要調用這個祖先類的接口方法,就會容易出現二義性。代碼33、34行就是因爲這個原因而出現編譯錯誤的。因爲通過多重繼承的Programmer_Author類擁有Author類和Programmer類的一份拷貝,而Author類和Programmer類都分別擁有Person類的一份拷貝,所以Programmer_Author類擁有Person類的兩份拷貝,在調用Person類的接口時,編譯器會不清楚需要調用哪一份拷貝,從而產生錯誤。對於這個問題通常有兩個解決方案:
(1)加上全局符確定調用哪一份拷貝。比如pa.Author::eat()調用屬於Author的拷貝。
(2)使用虛擬繼承,使得多重繼承類Programmer_Author只擁有Person類的一份拷貝。比如在11行和17行的繼承語句中加入virtual就可以了。
     

  1. class Author : virtual public Person //Author虛擬繼承自Person

  2. class Programmer : virtual public Person //Programmer虛擬繼承自Person

 

總結:

優點:

多繼承,可以調用多個基類的不同方法

缺點:

多繼承的類,如果調用基類的基類中的方法,容易造成歧義

 

部分參考:

https://blog.csdn.net/jandunlab/article/details/14110117

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章