c++物件導向程式設計(二)
一、過載與覆蓋
成員函式被過載的特徵:
(1 )相同的範圍(在同乙個類中);
(2 )函式名字相同;
(3 )引數不同;
(4 )virtual 關鍵字可有可無。
覆蓋是指派生類函式覆蓋基類函式,特徵是:
(1 )不同的範圍(分別位於派生類與基類);
(2 )函式名字相同;
(3 )引數相同;
(4 )基類函式必須有virtual 關鍵字。
二、隱藏規則
(1 )如果派生類的函式與基類的函式同名,但是引數不同。此時,不論有無virtual關鍵字,基類的函式將被隱藏(注意別與過載混淆)。
(2 )如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual
關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆)。
三、繼承情況下的類的作用域
1、如上所述,與基類成員同名的派生類成員將遮蔽對基類成員的直接訪問。但可以作用域操作符訪問被遮蔽的基類成員,如,return base::men;
2、如上所述,區域性作用域中宣告的函式不會過載全域性作用域中定義的函式,同樣,派生類所定義的函式也不過載基類中定義的成員,只有在派生類根本沒有定義該函式時,才考慮基類函式。
3、繼承層次確定函式呼叫遵循的四個驟
(1)首先確定進行函式呼叫的物件、引用或指標的靜態型別;
(2)在該類中查詢函式,如果找不到,就在直接基類中查詢,如此循著類的繼承鏈往上找,直到找到該函式或者查詢完最後乙個類。如果不能在類或其相關基類中找到該名字,則呼叫出錯;
(3)一量找到了該,就進行常規型別檢查,檢視如果給定找到的定義,該函式呼叫是否合法。
(4)假定函式呼叫合法,編譯器就生成**。如果函式是虛函式且通過指標呼叫,則編譯器生成**以確定根據物件的動態型別執行哪個函式版本,否酵母菌,編譯器生成**直接呼叫函式。
4、不能通過定義視窗儲存派生類物件來儲存基類物件,沒有從基類型別到派生型別的標準轉換。唯一可行的選擇可能是使用容器來儲存物件的指標。
5、更加嚴格的繼承規則應當是:若在邏輯上b 是a 的「一種」,並且a 的所有功
能和屬性對b 而言都有意義,則允許b 繼承a 的功能和屬性。
C 物件導向程式設計 知識筆記(二)
示例 include using namespace std const float pi 3.14159 定義常變數 intmain 執行程式輸出3.14159 const可以使用在主函式的外部,其意義為定義乙個變數不過這個變數是無法改變的常變數。c語言中也存在類似的函式 define 但兩者存在...
c 物件導向程式設計(二)
一 裝箱與拆箱 裝箱轉換允許將 值型別 隱式轉換為 引用型別 存在下列裝箱轉換 從任何 值型別 包括任何 列舉型別 到型別object。從任何 值型別 包括任何 列舉型別 到型別system.valuetype。從任何 值型別 到 值型別 實現的任何 介面型別 從任何 列舉型別 到system.en...
C 學習筆記 物件導向程式設計
1.什麼是類 物件和成員?類 乙個類包含很多的物件。比如人類就是乙個類,張 三 李四等是人類的物件,這些物件擁有人類共同的功能和資料,如身高 體重 年齡等,而具體化這些資料我們可看做是人類的成員變數。所以類是由若干個變數和相關函式組成,而物件則擁有這些變數和函式。2.如何宣告乙個類?類只有先宣告才能...