C++類的多重繼承
C++語言允許子類從多個父類繼承公有的和受保護的成員,這被稱爲多重繼承。
多重繼承是指有多個基類名標識符,其聲明形式如下:
class 派生類名:[繼承方式] 基類名,....[繼承方式] 基類名{
....
};
例如,目前有三個類:中國人、男人、中國的男人。那麼在定義中國的男人時,就可以把中國人、男人同時作爲基類。
#include<iostream>
using namespace std;
class China{
public:
China(){
cout<<"I'm a Chinese."<<endl;
}
};
class Man{
public:
Man(){
cout<<"I'm a man."<<endl;
}
};
class Person:public China,public Man{
public:
Person(){
cout<<"I'm a Chinese man."<<endl;
}
};
int main(){
Person p;
return 0;
}
結果圖:
程序中定義了China類、Man類,然後從這兩類中派生出了子類Person,Person自然繼承了China、Man類的所有公有和受保護的成員,因此在創建Person類的對象p時,p自然調用了China、Man、Person類的構造函數。
那麼問題來了!
Person繼承China、Man類的所有公有和受保護的成員,若China、Man均派生於同一個基類,如People類,那麼當China、Man派生一個新類Person時,Person類中將存在兩個People類的複製。能否在派生Person類時,使其只存在一個People類?
C++類的虛繼承
C++語言提供了虛繼承的機制。
如下:
#include<iostream>
using namespace std;
class People{
public:
People(){
cout<<"I'm a people"<<endl;
}
};
class China:virtual public People{//從People類虛繼承China類
public:
China(){
cout<<"I'm a Chinese."<<endl;
}
};
class Man:virtual public People{//從People類虛繼承Man類
public:
Man(){
cout<<"I'm a man."<<endl;
}
};
class Person:public China,public Man{
public:
Person(){
cout<<"I'm a Chinese man."<<endl;
}
};
int main(){
Person p;
return 0;
}
結果圖:
上述代碼在定義China、Man類時,使用了關鍵字virtual從基類People派生而來。
那麼,在創建Person類的對象p時,p先調用基類的基類People的 構造函數,然後調用China類的構造函數,這裏China類雖爲People類的派生類,但是將不再調用People類的構造函數,Man類同理不再調用People類的構造函數,這樣就避免了創建Person類新對象時存在多個People類的複製。
在程序開發過程中,多重繼承雖然帶來了很多方便,但是很少有人願意使用,因爲它會帶來很多複雜的二義性問題,並且它能夠完成的功能通過單繼承同樣可以實現。如今流行的C#、Delphi、Java等面向對象編程的語言沒有提供多重繼承的功能而只採用單繼承,這是經過設計者充分考慮的,因此,讀者在開發應用程序時,如果能夠使用單繼承實現,儘量不要使用多重繼承。