繼承就是在乙個已存在的類的基礎上建立乙個新的類。
已存在的類稱為基類,又稱父類;新建立類稱為派生類,又稱為子類。
繼承允許我們依據另乙個類來定義乙個類,不需要重新編寫一部分的資料成員和成員函式,達到了重用**功能和提高執行效率的效果。
乙個類可以派生自多個類,從多個基類繼承資料和函式。我們使用乙個類派生列表來指定基類。
class derived-class: access-specifier base-class
其中,訪問修飾符access-specifier
是public
、protected
或private
其中的乙個,如果未指定則預設private
。
搬運乙個例子
class shape
void setheight(int h)
protected:
int width;
int height;
};class rectangle: public shape
};int main(void)
派生類繼承了基類的屬性,繼承了基類的行為,可以新增額外的行為,也可以重新定義這些行為。
若基類定義的資料成員和派生類新增的資料成員同名,基類資料成員被覆蓋。注意,即使函式名相同,引數不同,也無法呼叫基類函式。
在訪問時,控制代碼的型別決定哪個類的成員被訪問。使用物件名或引用訪問同名成員,根據引用的型別決定,使用基類指標訪問同名的成員,根據指標型別決定。
派生類可以訪問基類中所有的非私有成員。乙個派生類繼承了除去建構函式、析構函式、過載運算子、友元函式以外所有的基類方法.
不同繼承型別的規則如下
保護繼承(protected):
私有繼承(private):
基類的友元函式可以訪問基類中的私有成員,以及派生類從基類中繼承的成員。派生類中的友元函式只能訪問派生類的私有成員,而不能訪問基類中的私有成員。
拷貝建構函式僅用於同類拷貝或派生類向基類拷貝,而不能用於基類向派生類拷貝。
虛函式與純虛函式
定義虛函式是為了允許用基類的指標來呼叫子類的這個函式。
例如以下程式的輸出結果為b
class a
在這裡,呼叫的是哪個函式不是在編譯時刻被確定的,而是在執行時刻被確定的。換言之,在編譯時,並不知道被呼叫的是基類的函式還是哪個派生類的函式。
定義乙個函式為純虛函式,代表函式沒有被實現,只是為了實現乙個介面。它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。定義方式為
virtual void func()=0;
多型
在物件導向語言中,介面的多種不同的實現方式即為多型。
類的多型允許將子類型別的指標賦值給父類型別的指標。賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。
從應用的角度說,在基類的函式前加上virtual
關鍵字宣告為虛函式後,在派生類中重寫該函式,執行時將會根據物件的實際型別來呼叫相應的函式。如果物件型別是派生類,就呼叫派生類的函式;如果物件型別是基類,就呼叫基類的函式。
帶有虛函式的類
每乙個類都有虛表,且虛表可以繼承。
如果子類沒有重寫虛函式,那麼子類虛表中仍然會有該函式的位址,只不過這個位址指向的是基類的虛函式實現。
如果重寫了相應的虛函式,那麼虛表中的位址就會改變,指向自身的虛函式實現。
如果派生類有自己的虛函式,那麼虛表中就會新增該項。
所謂類的多型性,即將基類的函式定義為虛函式,在派生類中重寫,執行時將會根據物件的實際型別來呼叫相應的函式。
注意區分類的多型性與函式的多型性。函式的多型性指乙個函式被定義成多個不同引數的函式,呼叫這個函式時,就會呼叫不同的同名函式。
派生類繼承自基礎類,可以描述基類物件集合中一組更細化、特殊的物件。派生類繼承了基類的屬性,繼承了基類的行為,可以新增額外的行為,也可以重新定義這些行為。
虛函式是為了允許用基類的指標來呼叫子類的這個函式。呼叫的是哪個函式不是在編譯時刻被確定的,而是在執行時刻被確定的。
定義乙個函式為純虛函式,代表函式沒有被實現,只是為了實現乙個介面。它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。
類的多型允許將子類型別的指標賦值給父類型別的指標。賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。
C 繼承派生多型
物件導向程式設計有4個主要特點 抽象,封裝,繼承,多型。如果沒有掌握這些主要特點,就是沒有掌握物件導向程式設計的真諦。下面歸納一下在物件導向程式設計中一些基本的要點和注意事項。1.當基類派生出乙個子類的時候,子類會繼承基類的所有成員 包括私有成員 但是私有成員在子類中是不可訪問的,而且基類中的巨集定...
C 繼承派生和多型的知識整理
1.繼承和派生 2.虛函式和多型 3.運算子過載的理解 4.類和物件提高 一.繼承與派生 1.基本定義 繼承與派生是同乙個過程從不同的角度看 保持已有類的特性而構成新類的過程稱為繼承 在已有類的基礎上新增自己的特性而產生新類的過程稱為派生 被繼承的已有類成為基類 父類 base class 派生出的...
繼承派生(只考慮public繼承)以及多型
一 繼承和派生 classb public a b繼承自a,b是a的派生。派生類擁有基類的全部成員函式和成員變數,但基類的private成員,派生類無法訪問 因此可以將派生類定義成基類的友元類,友元關係不具有傳遞性和繼承性 基類的protected成員 派生類的成員函式可以訪問當前物件的基類的保護成...