c 繼承和組合

2021-06-01 20:39:21 字數 1082 閱讀 7643

當建立乙個物件時,編譯器總是確保呼叫了所有的子物件的建構函式,如果子物件有自己的預設建構函式,那麼編譯器可以自動地呼叫它們。但是,如果子物件沒有預設建構函式,或者想改變建構函式的某個預設引數,這就會出現問題,因為這個新類的建構函式沒有權利訪問這個子物件的私有資料成員,所有不能直接對它們初始化。

解決的方法就是:建構函式初始化列表。

mytype::mytype(int i) : bar(i) { //…

建構函式的初始化表示式允許我們顯式地呼叫成員函式的建構函式,它的主要思想是:在進入新類的建構函式體之前呼叫所有其它的建構函式。即使編譯器可以隱藏地呼叫預設的建構函式,但在沒有對所有的成員物件和基類物件的建構函式進行呼叫之前,就沒辦法進入建構函式體,這是c++的乙個強化的機制,它確保了,如果沒有呼叫物件(或物件的一部分)的建構函式,就別想往下面進行。

建構函式和析構函式與眾不同的之處在於每一層函式都被呼叫。然而對於通常的成員函式,只是這個函式被呼叫,而它的那些基類版本不會被呼叫,如果還想呼叫重新定義過的成員函式的基類版本,則必須顯式地去做。

構造從類層次的最根處開始,而在每一層,首先會呼叫基類建構函式,然後呼叫成員物件的建構函式,呼叫析構函式則嚴格按照建構函式相反的次序。另外,對於成員物件,構造函式呼叫的次序完全不受建構函式的初始化表示式的次序影響,該次序是由成員物件在類中宣告的次序所決定的。

建構函式和析構函式用來處理物件的建立和析構操作,但它們只知道對它們特定層次上的物件做些什麼。所以,在該類以下各個層次中的所有的建構函式和析構函式都必須被呼叫,也就是說,建構函式和析構函式不能被繼承,必須為每乙個特定的派生類分別建立。

私有繼承:通過在基類表中去掉public或則通過顯式地宣告private,可以私有地繼承基類。當私有繼承時,我們是「照此實現」,也就是說,建立新類具有基類的所有資料和功能,但這些功能是隱藏的,所以它只是部分內部實現,該類的使用者訪問不到這些內部功能。

protected繼承:在理想情況下,private成員總是嚴格私有的,但在實際的專案中,有時希望某些東西隱藏起來,但仍允許其派生類的成員訪問,於是關鍵字protected派上了用場。它的意思是:「就這個類的使用者而言,它是private,但它可被這個類繼承來的任何類使用」。

C 回顧 繼承和組合

一 組合語法 實際上,我們一直在用組合建立類,只不過是在用內部資料型別或已存在類的物件組合新類。二 繼承語法 在 中和原來一樣給出該類的名字,但在類的左括號的前面,加乙個冒號和基類的名字 對於多重繼承,要給出多個基類名,它們之間用逗號分開 當做完這些時,將會自動地得到基類中的資料成員和成員函式。在繼...

c 繼承,組合

1 什麼是繼承 a繼承b,說明a是b的一種,並且b的所有行為對a都有意義 eg a woman b human a 鴕鳥 b 鳥 不行 因為鳥會飛,但是鴕鳥不會。2.什麼是組合 若在邏輯上a是b的 一部分 a part of 則不允許b從a派生,而是要用a和其它東西組合出b。例如眼 eye 鼻 no...

組合繼承和寄生式組合繼承

組合繼承綜合了原型鏈和盜用建構函式,解決了原型內引用值共享的問題,以及子類在例項化時不能給父類建構函式傳參的問題。缺點 呼叫了兩次父類建構函式影響效率,而且子類的原型物件上也擁有了不必要也用不上的屬性,即父類建構函式的例項屬性。這樣的話子類的例項物件如果刪除某個屬性,這個屬性仍然可以訪問到,因為它可...