類的繼承

  繼承是c++中一種很重要的概念,它使我們的代碼可以進行復用。繼承就是在原有類的特性下進行拓展,拓展出自己的特性,增加功能。那麼這樣所產生的類。稱之爲派生類。這樣就體現了從簡單到複雜的認知過程,也呈現了面向對象程序結構層次。


  那麼繼承到底是什麼呢?舉一個簡單的例子,所有學生都是人,但是所有人都不一定是學生。所有的人都要吃飯,呼吸,睡覺。學生也要做上述的事,但是學生還要學習,而不一定所有的人都要學習。用代碼表現出來就是這樣:

class Person
{
public:
	void Breath();
	void Eat();
	void Sleep();
};

class Studet :public Person
{
public:
	void Study();
};


   Student是子類名,冒號後面的public是繼承類型,在後面的就是我們的父類或者叫基類名。

先來說一下這個繼承類型。繼承類型也就是子類對父類的對象成員的訪問權限。也就是說我們在這裏可以寫public/private/protect。每種有什麼不同呢?我的理解是繼承類型就是對父類成員的訪問權限的上限。比如說像我們上面代碼的情況,那麼我們對父類對象的成員的訪問權限跟父類裏面的是一樣的,public還是公有,private還是私有不可以在類外訪問。那麼假如是private繼承,我們父類中所有的成員都會是private的類型,不可以在類外訪問。


   總體來說,父類的private成員都是不可以在基類外進行訪問的,但是假如我們想在派生類裏訪問父類裏面的成員,而且父類裏面的成員還是不可以在除了派生類的其他區域進行訪問的話,那麼我們就將它聲明爲protect。不管是哪種繼承方式,父類中的public和protect成員都是可以在我們的派生類裏面進行訪問的。


   下面來說一下派生類裏面的默認成員函數。和其它類一樣,假如我們沒有在派生類裏面顯示的定義那六個默認成員函數的話,編譯器依然會幫我們合成默認成員函數。那麼調用順序呢?我們定義了一個派生類之後,系統會首先定義基類的構造函數,之後是派生類中的對象的構造函數,最後纔是派生類的構造函數。析構函數調用的順序是完全相反的。


   那麼派生類和基類的作用域是怎麼回事呢?他們的作用域是完全不同的兩個作用域。假如基類和派生類裏面有同名成員,我們要訪問基類中的成員要這樣(基類::基類成員),通過使用作用域限定符來訪問,假如直接寫那個同名的成員名會訪問派生類中的成員。


   那假如我想把派生類的對象賦值給基類,可以嗎?答案是肯定的。但是反過來就不行。我們可以這麼來理解。子類中有兩部分東西,一部分是父類的特性,一部分是自己的特性。父類中只有的是父類自己的特性。那麼我想進行賦值,會發生的事就是,我們把子類中的父類的東西給父類賦值過去,而子類他自己的特性父類根本就不需要,它只讀取了父類中有的那一部分。而我們把父類賦值給子類呢?子類就會讀取相當於子類大小的那麼一塊空間,而父類中只有父類的,他後面的空間根本就是不是屬於他的,那麼子類一進行讀取那麼肯定要出現錯誤。那麼指針和引用也同理。


   特別說一下,友元關係是不可以進行繼承的,基類友元是不可以訪問子類的私有和保護成員的。


   還有基類中定義了static成員,那麼無論派生了多少個子類,都只有一個static成員。


   最後是單繼承,多繼承,菱形繼承。

   上面所討論的就是單繼承,下面來舉一個多繼承的例子。

class Men
{
public:
	void Breath();
	void Eat();
	void Sleep();
};

class Women
{
public:
	void Breath();
	void Eat();
	void Sleep();
};

class Studet :public Men,public Women
{
public:
	void Study();

};


   這裏就是一個多繼承,學生既有男生也有女生。


   所謂菱形繼承就是這樣:

class Person
{
public:
	void Breath();
	void Eat();
	void Sleep();
};

class Men:public Person
{
public:
	void Breath();
	void Eat();
	void Sleep();
};

class Women:public Person
{
public:
	void Breath();
	void Eat();
	void Sleep();
};
class Studet :public Men,public Women
{
public:
	void Study();

};


   男人和女人都是人,學生既有男人也有女人。但是學生類裏面就有兩份人類的東西,存在了二義性和數據冗餘的問題。

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