C 繼承派生多型

2021-07-13 22:27:06 字數 2659 閱讀 4979

物件導向程式設計有4個主要特點:抽象,封裝,繼承,多型。如果沒有掌握這些主要特點,就是沒有掌握物件導向程式設計的真諦。下面歸納一下在物件導向程式設計中一些基本的要點和注意事項。

1.當基類派生出乙個子類的時候,子類會繼承基類的所有成員(包括私有成員),但是私有成員在子類中是不可訪問的,而且基類中的巨集定義,typedef定義語句在子類中都是不可見的,也就是說子類不會繼承這種型別的變數,通過下面的**我們可以看出來:

class a;

class b: public a;

class c: private a;

class d;

int _tmain(int argc, _tchar* argv)

結果如下:

2.在c++中,通過基類的引用或者指標呼叫虛函式時,發生動態繫結。用引用或者指標呼叫虛函式在執行時確定,被呼叫的是引用或者指標索指物件的實際型別所定義的。除了建構函式之外,任何非靜態成員函式都可以是虛函式。

3.通常如果有用在給定呼叫中的預設實參值,該值將在編譯時確定。通過基類的引用或者指標呼叫虛函式的時候,預設實參為在基類虛函式中指定的值,如果通過派生類的指標或者引用呼叫虛函式,則預設實參實在派生類的版本中申明的值。在同一虛函式的基類和派生類版本中使用不同的預設實參幾乎一定會引起麻煩。**如下:

class a};

class b : public a

};int _tmain(int argc, _tchar* argv)

結果如下:

4.如果子類繼承基類的方式為私有繼承,那麼當子類再派生子類的時候,子類的子類將不能訪問子類從基類繼承過來的成員,如果想要子類的子類能夠訪問到基類的成員,則可以在子類的public或protected部分增加乙個using宣告,如下:

class a;

class b : private a;

這樣,b的子類就可以訪問a類中的變數a了。

5.友元關係不能繼承,基類的友元對派生類沒有特殊的訪問許可權。如果基類被授予友元關係則只有基類具有特殊的訪問許可權,該基類的派生類不鞥訪問授予友元關係的類。如果想要派生類將自己的成員訪問授予其基類的友元,派生類也必須顯式的這樣做。如果派生類和基類都要訪問另乙個類,那個類必須特地的將訪問許可權授予每乙個派生類。

6.如果基類定義了static成員,則整個繼承層次只有乙個這樣的成員,無論基類派生多少個派生類,每個static成員只有乙個例項。

7.建立子類的時候,如果子類構造的時候沒有呼叫基類的建構函式,系統將呼叫基類的預設建構函式,**如下:

class base

執行結果:

但是,如果基類中定義了其它建構函式而沒有定義預設建構函式,當子類想通過基類的預設建構函式來構造積累的時候將會出現編譯錯誤,**如下:

class base

int a;};

class derived : public base

在base中定義了其它建構函式,所以系統將不會為其合成乙個預設建構函式,當derived想要呼叫base的預設建構函式的時候,系統無法找到base的預設建構函式,所以會報錯,即使在derived中不顯式呼叫base的預設建構函式,比如:

derived()    //error c2512: 「base」: 沒有合適的預設建構函式可用

virtual~base()

virtual void fun()};

class derived : public base

virtual~derived()

virtual void fun()

};int _tmain(int argc, _tchar* argv)

執行結果:

在基類的構造和析構時,呼叫的都是基類的函式,而不是派生類的函式。

11.在基類和派生類中使用同一名字的成員函式,其行為與資料一樣,在派生類作用域中派生類成員將遮蔽基類成員,即使函式原型不同,也會被遮蔽。**如下:

class base};

class derived : public base};

int _tmain(int argc, _tchar* argv)

d.fun();想通過子類的物件呼叫基類中的fun()函式,編譯器首先在子類中查詢名字fun,找到之後便不再向基類中查詢,即使是引數不匹配,這個呼叫希望接受乙個int實參,而這個函式在子類中被遮蔽了,因此出錯。

12.如果類使用的是protected或者priva繼承派生的,則使用者不能將派生類物件轉換為基類物件。

13.任何妄圖使用父類指標想呼叫子類中的未覆蓋父類的成員函式的行為都會被編譯器視為非法,如下面的**:

base1 *b1 = new derive();

b1->f1();  //編譯出錯

這樣的程式根本無法編譯通過。但在執行時,我們可以通過指標的方式訪問虛函式表來達到違反

c++語義的行為。

C 繼承 派生 多型

繼承就是在乙個已存在的類的基礎上建立乙個新的類。已存在的類稱為基類,又稱父類 新建立類稱為派生類,又稱為子類。繼承允許我們依據另乙個類來定義乙個類,不需要重新編寫一部分的資料成員和成員函式,達到了重用 功能和提高執行效率的效果。乙個類可以派生自多個類,從多個基類繼承資料和函式。我們使用乙個類派生列表...

C 繼承派生和多型的知識整理

1.繼承和派生 2.虛函式和多型 3.運算子過載的理解 4.類和物件提高 一.繼承與派生 1.基本定義 繼承與派生是同乙個過程從不同的角度看 保持已有類的特性而構成新類的過程稱為繼承 在已有類的基礎上新增自己的特性而產生新類的過程稱為派生 被繼承的已有類成為基類 父類 base class 派生出的...

繼承派生(只考慮public繼承)以及多型

一 繼承和派生 classb public a b繼承自a,b是a的派生。派生類擁有基類的全部成員函式和成員變數,但基類的private成員,派生類無法訪問 因此可以將派生類定義成基類的友元類,友元關係不具有傳遞性和繼承性 基類的protected成員 派生類的成員函式可以訪問當前物件的基類的保護成...