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