C 自學筆記 15)之隱藏與isA

2021-09-17 01:25:09 字數 2676 閱讀 8976

隱藏就是當父類與子類定義相同的成員時,子類從父類繼承來的成員會隱藏掉,例項化時呼叫子類的成員。

如上圖在定義兩個有繼承關係的類後,下圖中例項化後紅色語句第一行是呼叫子類的play,第二行是呼叫父類的play

(1)如果是定義了同名的資料成員需要在子類的成員函式中呼叫時區分的話,如父類的string code,與子類的int code(同型別也一樣)。也可採用上圖中的方式codeperson::code來區分。(一般命名遵循m_資料型別+變數名不會出現這種問題)

(2)注意有繼承關係父子類同名成員函式,即使父類是無參,子類是有參,在例項化後子類呼叫無參函式也不會呼叫父類的函式,而會報錯。

子類可以看做是父類,如**眼鏡也是眼鏡,工人也是人。這種關係看做isa

定義了乙個父類person與子類soldier,例項化時如下圖。

可以看出例項化物件後,子類可以賦值給父類,父類的指標也可以指向子類的物件,而反過來是錯誤的。在記憶體中如下圖所示。

當子類物件賦值給父類時,僅僅會將父類與子類公有的成員函式以及資料成員賦值給父類,子類自己的資料成員等(如圖中m_strcode)是不會給父類的。在用指標時,父類的指標也僅能指向子類與父類公有的成員。

此外,當父類指標用堆的方法指向子類 如person *p=new solider,在銷毀指標p的時候子類的記憶體不會釋放,這個時候需要構造虛析構函式

父類virtual ~person()子類virtual ~soldier()(子類的virtual可不寫)

詳見 可以將父類的物件作為形參,這樣子類和父類都可以作為實參傳入。如下圖。

圖中,fun1形參是父類的物件指標,fun2形參是父類的物件引用。右邊影象是父子類的物件都可以作為實參傳入。

定義如下兩個父子類,以及分別將類的物件、物件引用、物件指標作為形參的三個函式。

#include

#include

#include

using namespace std;

//定義父類

class person

virtual ~

person()

//虛析構函式

void

play()

protected:

string m_strname ;};

//定義公共繼承的子類

class soldier : public person

~soldier()

void

play()

protected:

//string m_strname; 這裡博主加了這句,最後結果都會顯示jim,不太清楚為什麼,有知道的希望能說一下};

//定義呼叫函式

void

text1

(person p)

//形參為物件

void

text2

(person &p)

//形參為引用

void

text3

(person *p)

//物件為指標

①實參為物件

可見在例項化子類時會呼叫一次父類的析構函式

而再呼叫text1時,因為形參為物件p,因此傳值是會臨時例項化物件p,函式呼叫完後這個臨時物件p會被銷毀,這裡jimjame是分別呼叫person的物件和soldier的物件的結果

②實參為物件引用(呼叫text2)

③實參為物件指標(呼叫text3)

可見用引用和指標的方式都不會產生臨時物件,更為高效。

C 自學筆記之異常

argumentexception當向方法提供的引數之一無效時引發的異常。argumentnullexception當將 null 引用 visual basic 中為nothing 傳遞到不接受其作為有效引數的方法時引發的異常。argumentoutofrangeexception當自變數的值超出...

C 自學筆記 5 之函式特性 與c相比

有預設值的引數必須寫在參數列的最右端,如圖 推薦在宣告的時候指定引數的預設值,定義的時候不指定,如下圖 無實參使用預設值,否則實參覆蓋預設值 在相同作用域內,同一函式名定義的多個函式,引數個數和引數型別不同,如 int max int a,int b,intc float max float a,f...

C 自學筆記 3 之引用

引用是變數的別名,格式 為 型別 引用變數 被引用變數 先看一段 int main void 輸出結果為1 0可見,改變引用的變數也會改變原變數,反之,更改a的值b也會發生改變 定義結構體變數coor,並定義c1對其進行引用 include using namespace std typedef s...