C++類的多重繼承、虛繼承

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;
}

結果圖:
ChineseMan
程序中定義了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;
}

結果圖:
People
上述代碼在定義China、Man類時,使用了關鍵字virtual從基類People派生而來。
那麼,在創建Person類的對象p時,p先調用基類的基類People的 構造函數,然後調用China類的構造函數,這裏China類雖爲People類的派生類,但是將不再調用People類的構造函數,Man類同理不再調用People類的構造函數,這樣就避免了創建Person類新對象時存在多個People類的複製。

在程序開發過程中,多重繼承雖然帶來了很多方便,但是很少有人願意使用,因爲它會帶來很多複雜的二義性問題,並且它能夠完成的功能通過單繼承同樣可以實現。如今流行的C#、Delphi、Java等面向對象編程的語言沒有提供多重繼承的功能而只採用單繼承,這是經過設計者充分考慮的,因此,讀者在開發應用程序時,如果能夠使用單繼承實現,儘量不要使用多重繼承

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