舉例:現實生活中,許多事物可能有兩個或者兩個以上事物的屬性,爲了描述這種情況,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就可以了。
-
class Author : virtual public Person //Author虛擬繼承自Person
-
class Programmer : virtual public Person //Programmer虛擬繼承自Person
總結:
優點:
多繼承,可以調用多個基類的不同方法
缺點:
多繼承的類,如果調用基類的基類中的方法,容易造成歧義
部分參考: