public繼承是一種is-a關系。也就是說适用于base classes(基類)身上的每一件事都一定适用于derived classes(繼承類),每一個derived classes對象都是一個derived classes對象。


上面的例子中,每一個B都是一個A對象,故我們可以調用A中的函數,而且對于一個操作A的函數,我們也可以直接用B作為參數,這時,B會自動轉換為A對象。
也就是說,public繼承導緻了功能的擴充,在基類可以使用的地方,繼承類都可以。反之,如果你想在使用繼承類的地方用基類來替換,那就很可能出現錯誤。他們的關系大概是這樣的:
這個問題其實與繼承無關。 看一個關于全局變量和局部變量的例子:
這裡的int x為全局變量,double x為局部變量。
在繼承中,當位于一個derived class成員函數需要使用base class内的内容時,編譯器就要找出我們需要的内容,這是由于derived class作用域被嵌套在base class作用域内。


用圖形來表示大概是這樣的:
編譯器在查找目标内容時,首先在local作用域中查找,就是途中的Derived作用域,如果沒有找到我們需要的内容,就會向外移動,在Base作用域中開始查找。
但這裡會有一個問題,如果名稱相同,無論參數是什麼的(無論是需函數還是非虛函數),都會被覆寫。注意:這裡與函數重載是不同的~!!!!
如下:


上面出現的錯誤的原因在于,Derived class中的同名函數覆寫了Base class的。
那怎麼解決這個問題呢?
可以使用using生命表達目标内容
轉交函數


通過使用using聲明式,修改後我們就可以調用Base class内的同名函數了。


通過私有繼承private,實作了Base class中函數的掩蓋,然後通過Base::mf1來調用Base class中某個函數,實作了具體的功能掩蓋和實作。
本文轉自cococo點點部落格園部落格,原文連結:http://www.cnblogs.com/coder2012/archive/2013/06/10/3130477.html,如需轉載請自行聯系原作者