我們知道c++是一門物件導向的語言,它有三大特性:封裝、繼承、多型。其中多型是最具有物件導向程式設計的特性。
多型分靜態多型和動態多型。靜態多型也稱編譯時多型,指通過函式過載、運算子過載等,根據引數列表在編譯時刻確定呼叫函式。動態多型也叫執行時多型,是在執行時刻才確定呼叫的函式,執行時多型是通過類中的虛函式實現的。
在類的函式宣告前加上關鍵字virtual,該函式就是乙個虛函式了。編譯器會給有虛函式的類在全域性資料區里分配一塊虛函式表(virtual table),虛函式表的每一項對應該類的虛函式位址。隱式的編譯器還在類中插入第乙個成員——類的虛函式表指標。此後,當呼叫該類的虛函式時,編譯器不是硬編碼函式位址,而是間接呼叫虛函式表對應項的函式位址。另外編譯器會在每個建構函式**前生成初始化虛函式表指標的**(指向本類的虛函式表)。
當派生類繼承帶有虛函式的基類時,理所當然的也將繼承其虛函式表,派生類虛函式表的開頭部分順序拷貝自基類,之後才是派生類自己的虛函式表項。當然派生類也可以覆蓋掉基類的虛函式(改寫虛函式表項內容),只要在派生類中重新定義基類的虛函式(可以不加virtual關鍵字,不加的話影響可讀性),覆蓋函式的名字、引數列表、返回值、呼叫約定必須與被覆蓋函式相同。虛函式通過間接呼叫的方式,實現了繼承自同乙個基類的不同派生類,呼叫同乙個基類虛函式,卻實現不同的功能,這樣就形成了類的多型。
最後vc6對虛函式呼叫作了一點優化,只有當物件指標或引用方式呼叫虛函式時,才會通過虛函式表間接呼叫,如果是使用物件直接(成員訪問運算子)呼叫,編譯器在編譯時會生成虛函式位址的硬編碼,而非間接呼叫。
科銳課堂筆記 2017 2 28 迴圈相關
大數階乘演算法優化,例求10的階乘1 2 3 4 5 6 7 8 9 10可轉換成 1 3 5 7 9 2 4 6 8 10 1 3 5 7 9 1 2 3 4 5 2,即把乙個大數階乘轉換成若干小數階乘,乘多少次2可用左移指令完成,其中2 5可去掉,記住有多少次2 5結果末位就加上多少個0,這樣一...
科銳課堂筆記 2017 3 17 結構體
結構體是不同資料 包括型別或邏輯意義 的集合。在設計定義乙個結構體時,要把其合理的資料組織在一塊。點 運算子用來訪問結構體成員,點運算子優先順序僅次於括號。vc6中預設的編譯選項,結構體成員對齊為8位元組 zp8 結構體成員的偏移位址規則是,必須是結構體成員對齊位元組數 zp?和該成員型別長度 字串...
科銳課堂筆記 2017 2 23 浮點小數儲存格式
階乘100的解題思路用陣列存數模擬手工算乘法。結果值有150多位 遞迴比迴圈效率低多了,能不用就不用。線性問題優先使用迴圈。數字後加f表示單精度,不加雙精度 對小數而言 定點小數優點快速高效,但缺乏靈活性。單精度浮點小數儲存格式 共4位元組 如圖 這裡需要注意,指數部分存的是指轉換成二進位制下小數點...