派生類詳解

2021-10-06 16:19:49 字數 2641 閱讀 9990

派生類:

一:相關概念

基類(父類,超類)

子類定義子類的方式:

class 子類名:繼承方式 父類名

//繼承方式:public private protected

二:定義乙個子類物件時,構造函式呼叫的順序,析構函式調

用的順序。

class

b//父類~b

()};

classa:

public b //子類~a

()};

a obj;

//定義子類物件時需要呼叫父類和子類的建構函式。

//構造函式呼叫順序:先父後子

//析構函式呼叫順序:先子後父

三:等級訪問問題(public private protected)

四:函式遮蔽問題

概述:在定義乙個子類物件時,是可以呼叫父類的成員函式的(和訪問等級和繼承方式有關),例如:

classb}

;classa:

public b

;int

main()

但是,如果在子類中,有乙個和父類中相同的函式的話(函式名相同即可,不管形參個數),那麼這個時候,定義乙個子類物件時,所有的在父類中的同名函式就呼叫不了了,即被遮蔽了,例如:

class

bvoid

fun(

int a)};

classa:

public b~a

()void

fun(

int a,

int b)};

intmain()

當然,如果這個時候,在子類中有乙個和父類中的同名函式的話(形參也相同),那麼這個時候呼叫的當然也就是子類中的函式,例如:

classb}

;classa:

public b};

intmain()

如果,在子類中有了和父類中相同的函式名的話,那麼這個時候想呼叫父類中的同名函式(呼叫那些被遮蔽的同名函式,)的話,有兩種辦法。

辦法一:

使用:using

在c++11中為using定義了一種含義,即除了命名空間外的含義。

classb~

b()void

fun(

)void

fun(

int a)};

classa:

public b~a

()void

fun(

int a,

int b)

public

:using b::fun;

//讓父類的同名函式在子類中暴露出來};

intmain()

五:派生類物件模型概述

派生類是由兩部分組成的,一部分是基類部分,一部分是派生出來的(除了基類部分的成員)

所以對於乙個父類指標可以new乙個子類物件來說,因為子類物件含有父類部分,所以這個子類是可以當作父類來用的,因此,也解釋了,為什麼乙個父類指標可以new乙個子類物件。

所以有時候,乙個子類指標是可以賦值給父類指標的。

classa~

a()}

;classb:

public a~b

()};

intmain()

六:派生類的建構函式

定義乙個派生類物件時,基類建構函式用來初始化基類部分,派生類建構函式用來初始化派生類部分。

但是,如果基類沒有無參的建構函式,而是有有參的建構函式(不管是幾個有參的建構函式)時,就面臨著引數傳遞問題,即,如果只有預設構造該函式,那麼我們不用手動呼叫基類的建構函式,就可以完成基類和子類部分成員的初始化,但是,如果只有有參的建構函式的話,就需要自己手動呼叫父類的建構函式了。

classaa

(int a,

int b)~a

()public

:int m_a;};

classb:

public a~b

()public

:int m_b;};

intmain()

七:既是父類又是子類的類。

八:不想當基類的類

c++11 final的使用

使用方法:在類名後邊加final

class

a final~a

()public

:int m_a;};

classb:

public a //錯誤~b

()public

:int m_b;

};

說明:如果類b不想當基類,那麼同樣可以在類b名後邊加final

九:靜態型別和動態型別

靜態型別:也就是宣告時的型別。編譯時已知。

動態型別:指的是記憶體中的型別。

只有基類指標存在靜態型別和動態型別不一樣的情況。

十:派生類向基類的隱式型別轉換,父類與子類之間的拷貝與賦值

這一部分,可按派生類模型來理解。

基類和派生類記憶體詳解

昨天室友問了我乙個c 基類和派生類的記憶體方面的問題,由於當時不能給出確切的答案,所以今天在vs上面乙個個測試了一遍,今記錄下來。問題歸結為如下 class a public a a 0 cout b b a p b p fun p vfun p a 2 通過p改變a中a的值 couta a的值 基...

構造派生類

include include 繼承 構造派生類 using namespace std class student student 這個就是預設建構函式。就不能再有student std cout student 進一步解釋 對於student string pname noname 不輸入引數是...

生成派生類

1.吸收基類成員 將基類成員全盤吸收 派生類包含了除構造和析構函式之外所有成員。定義派生類後自動完成,無法干預 2.改造基類成員 1 基類成員訪問控制問題,依靠派生類定義時的繼承方式來控制。2 對基類資料或函式成員覆蓋與隱藏。同名隱藏 申明了乙個與基類成員同名的新成員 if是成員函式則參數列必須相同...