C 繼承學習筆記

2021-05-22 23:51:46 字數 1639 閱讀 2318

派生類從基類繼承了保護(protected)成員和公有(public)成員函式,但是繼承不了基類的過載建構函式。

定義乙個如下基類:

class counter

counter operator + (counter n);

void reset()

int getcount()

int getnum()

};counter counter::operator + (counter n)

counter::counter()

counter::counter(int var)

counter::~counter() 

從基類派生乙個類:

class newcounter:public counter

;  void newcounter::operator --()

主程式定義如下幾個物件:

int main(int main(int argc, char *argv)

counter mycount,yourcount(1),hiscount;

newcounter mynewcounter(5);

當我嘗試用5來初始化mynewcounter時,編譯器報錯。此時回憶起建構函式的定義:建構函式必須與類同名,系統允許過載建構函式。

在上個派生類物件mynewcounter宣告中我未定義建構函式newcounter(int var);所以無法初始化這個物件。 

首先修改程式如下:

int main(int main(int argc, char *argv)

counter mycount,yourcount(1),hiscount;

newcounter mynewcounter;

編譯通過!

通過設定斷點,發現生成物件mynewcounter前會先呼叫基類的預設建構函式counter::counter(),通過建構函式將num,count初始化為0值;

為了達到將派生類物件初始化成自己想要的結果,我嘗試修改派生類宣告定義如下:

class newcounter:public counter

;           

newcounter::newcounter()

主程式不變!

通過編譯執行,發現物件mynewcounter在生成時先呼叫一次基類的建構函式counter,接著才呼叫派生類的建構函式newcounter();

且如願將num,和count初始化為1。

接著,再為派生類newcounter增加乙個過載建構函式如下:

newcounter::newcounter(int var)

num=var;

count=var;

修改主程式如下:

int main(int main(int argc, char *argv)

counter mycount,yourcount(1),hiscount;

newcounter mynewcounter(5);

編譯除錯結果:

程式成功生成乙個初始化為5的物件,仍然是先呼叫基類的建構函式,再呼叫派生類的過載建構函式。

學習心得體會:在派生類生成物件時想要使用過載的建構函式初始化物件的話,必須要在派生類中重新定義過載的建構函式。

C 學習筆記 繼承

一 c 中的繼承方式會影響子類的對外訪問屬性 public 修飾的成員變數 方法 在類的內部 類的外部都能使用 protected 修飾的成員變數方法,在類的內部使用,在繼承的子類中可用 private 修飾的成員變數方法,只能在類的內部使用 二 private成員在子類中依然存在,但是卻無法訪問到...

c 學習筆記 繼承

虛基類 派生類繼承的時候使用virtual關鍵字繼承的基類。個人認為叫 虛繼承 更為具體直觀。使用虛基類可以消除由多繼承產生的二義性。派生類可以隱含的轉換為基類,反之則不行。可以使用using語句繼承基類的建構函式,預設情況不繼承基類的建構函式。在即有繼承又有組合的時候,建構函式的呼叫順序為 先呼叫...

C 學習筆記 繼承

作為物件導向三大特性之一,繼承的好處是可以減少重複的 比如,我們在建立乙個比較大的 時,中有很多頁面,每個頁面其實是有一些相同的東西的,比如標題欄,導航欄還是廣告等等。如果我們在寫每個頁面時都把這些公共的部分重新寫一遍,會非常累贅,我們可以把公共的部分封裝為乙個類 父類 後面的頁面去繼承這個類,這樣...