天天看點

25、C++ Primer 4th 筆記,面向對象程式設計(3)

1、在繼承情況下,派生類的作用域嵌套在基類作用域中。正是這種類作用域的層次嵌套使我們能夠直接通路基類的成員。

2、與基類成員同名的派生類成員将屏蔽對基類成員的通路。可以使用作用域操作符通路被屏蔽的基類成員。

3、在基類和派生類中使用同一名字的成員函數,其行為與資料成員一樣:在派生類作用域中派生類成員将屏蔽基類成員。即使函數原型不同,基類成員也會被屏蔽。

4、通過派生類對象調用基類對象時,實參必須與派生類中定義的版本相比對,隻有在派生類根本沒有定義該函數時,才考慮基類函數。

如果派生類想通過自身類型使用所有的重載版本,則派生類必須要麼重定義所有的版本,要麼一個也不重定義。

可以通過using為基類成員函數名稱進行聲明,将所有該函數的重載執行個體都加到派生類的作用域中。

5、名字查找與繼承

1)首先确定進行函數調用的對象、引用或指針的靜态類型。

2)在該類中查找函數,如果找不到,就在直接基類中查找,如此循着類的繼承鍊往上找,直到找到該函數或者查找完最後一個類。

    如果不能在類或其相關基類中找到該名字,則調用是錯誤的。

3)一旦找到了該名字,就進行正常類型檢查,通過檢視找到的定義,來檢查該函數調用是否合法。

4)假定函數調用合法,編譯器就生成代碼。如果函數是虛函數且通過引用或指針調用,則編譯器生成代碼以确定根據對象的動态類型運作哪個函數版本,否則,編譯器生成代碼直接調用函數。

6、含有(或繼承)一個或多個純虛函數的類是抽象基類。除了作為抽象基類的派生類的對象的一部分,不能建立抽象類型的對象。

7、容器與繼承

在容器中儲存有繼承關系的對象,如果定義成儲存基類對象,則派生類将被切割,如果定義成儲存派生類對象,則儲存基類對象又成問題(基類對象将被強制轉換成派生類對象,而派生類中定義的成員未被初始化)。

唯一的可行的選擇是容器中儲存對象的指針。但是需要使用者管理對象和指針。C++中一個通用的技術是包裝類(cover)或句柄類(handle)。用句柄類存儲和管理類指針。

8、包裝了繼承層次的句柄有兩個重要的設計考慮因素:

1)像對任何儲存指針的類一樣,必須确定對複制控件做些什麼。包裝了繼承層次的句柄通常表現得像一個智能指針或者像一個值。

2)名柄類決定句柄接口屏蔽還是不屏蔽繼承層次,如果不屏蔽繼承層次,使用者必須了解和使用基本層次中的對象(objects in the underlying hierarchy)。

    句柄類經常需要在不知道對象的類型時配置設定已知對象的副本。解決這個問題的通用方法是定義虛操作進行複制,稱該操作為clone,如示例中。

句柄類示例

<a href="http://files.cnblogs.com/mydomain/%E5%8F%A5%E6%9F%84%E7%B1%BB%E7%A4%BA%E4%BE%8B.rar">句柄類示例</a>

9、虛函數的重寫中,派生類的傳回類型必須與基類執行個體的傳回類型完全比對,但有一個例外:如果虛函數的基類執行個體傳回類類型的引用或指針,則該虛函數的派生類執行個體可以傳回基類執行個體傳回的類型的派生類對象(或者是類類型的指針或引用)。

10、在定義關系運算符時,如定義==,&lt;=時,其邏輯要一緻。

參考

[1] multiset使用

<a href="http://blog.163.com/zhoumhan_0351/blog/static/399542272010396030501/">http://blog.163.com/zhoumhan_0351/blog/static/399542272010396030501/</a>

繼續閱讀