C 語法學習(6)

2021-08-21 22:00:39 字數 1366 閱讀 1153

1.函式重寫

在子類中定義與父類中原型相同的函式

函式重寫只發生在父類與子類之間

過載與重寫區別:

過載:同乙個作用域;

子類無法過載父類函式,父類同名函式將被覆蓋;

過載是在編譯期間根據引數型別和個數決定;

重寫:發生於父類、子類之間;

父類和子類函式有相同的函式原型;

使用virtual關鍵字宣告後能夠產生多型;

執行期間根據具體物件型別決定呼叫的函式。

2.根據實際的物件型別來判斷重寫函式的呼叫

如果父類指標指向的是父類物件則呼叫父類中定義的函式

如果父類指標指向的是子類物件則呼叫子類中定義的重寫函式

3.多型成立的三個條件

1、要有繼承

2.要有繼承函式重寫

3.用父類指標指向子類物件

4.1、聯編是指乙個程式模組、**之間互相關聯的過程。

2、靜態聯編(static binding),是程式的匹配、連線在編譯階段實現,也稱為早期匹配。

過載函式使用靜態聯編。

3、動態聯編是指程式聯編推遲到執行時進行,所以又稱為晚期聯編(遲繫結)。

switch 語句和 if 語句是動態聯編的例子。

4、理論聯絡實際

1、c++與c相同,是靜態編譯型語言

2、在編譯時,編譯器自動根據指標的型別判斷指向的是乙個什麼樣的物件;所以編譯器認為父類指標指向的是父類物件。

3、由於程式沒有執行,所以不可能知道父類指標指向的具體是父類物件還是子類物件

從程式安全的角度,編譯器假設父類指標只指向父類物件,因此編譯的結果為呼叫父類的成員函式。這種特性就是靜態聯編。

5.在什麼情況下應當宣告虛函式

建構函式不能是虛函式。建立乙個派生類物件時,必須從類層次的根開始,沿著繼承路徑逐個呼叫基類的建構函式

析構函式可以是虛的。虛析構函式用於指引 delete 運算子正確析構動態物件 

虛析構函式:通過父類指標釋放子類物件

6. 構造的順序是先構造父類、再構造子類

當呼叫父類的建構函式的時候,虛函式指標vfptr 指向父類的虛函式表

當父類構造完,呼叫子類的建構函式的時候,虛函式指標 vfptr 指向子類的虛函式表

結論:建構函式中無法實現多型

7.指標也是一種資料型別,c++類物件的指標p++/--,仍然可用。

指標運算是按照指標所指的型別進行的。

父類p++與子類p++步長不同;不要混搭,不要用父類指標++方式操作子類物件陣列

8.抽象類

含有純虛函式的類

抽象類不能用於直接建立物件例項,可以宣告抽象類的指標,引用

可以用指向抽象類的指標支援執行時多型性

派生類中必須實現基類中的純虛函式,否則仍被看做乙個抽象類

c 語法學習

迴圈和關係表示式 for迴圈 表示式和語句 遞增和遞減,字首式效率更高 組合賦值操作符 復合語句 逗號操作符 關係操作符,和 while迴圈 typedef工具 dowhile迴圈 get 字元輸入方法 檔案尾條件 巢狀迴圈和二維數值 strcmp a,b 判斷兩個字串是否相等 cin如何處理字元輸...

ES6語法學習

let 變數 和const 常量 let name jarvis const name jarvis let相當於之前的var,作用域可以是全域性或者塊級作用域,不同作用域互不干擾。注意 1.沒有預解析,不存在變數提公升在 塊內,只要let定義變數,在之前使用,都是報錯 2.同乙個作用域裡,不能重複...

ES6語法學習

一 作用域 const var let 核心 儘量減少使用var,常量使用const,塊級作用域使用let 5個按鈕,實現點選第i個按鈕,顯示i按鈕被點選。var btn document.getelementsbytagname button es5使用閉包解決var作用域問題 for var i...