條款12:確定你的public繼承塑膜出is-a關系:
這個條款主要將了一些特殊情況:比如企鵝是鳥,企鵝可以繼承於鳥,但是鳥會飛,企鵝卻不能飛;還有讓正方形繼承矩形可能也會造成這種尴尬!
這個問題以前想過,但是不知道怎麼解決,如果現實生活當中確實要這麼使用:比如 貓 狗 魚 豬等等許多動物繼承Animal類,但是貓狗等不會游泳,
假如這裡是有很多動物,不能采用魚裡面專門加一個方法! 這個現在還沒想出來,條款12也沒有講如果要這麼用該怎麼處理就是將要避免這樣。
is - a;
在面向對象程序設計裡面,ia - a指的是類的父子繼承關系;
public繼承就意味著 is - a ,適用於base - class 身上的每一件事情也一定適應於derived class身上。因此每一個子類對象也是一個父類對象。
條款13:避免遮掩繼承而來的名稱:
這個條款主要講了遮掩繼承,其實也就是我們經常說的 重載 重寫(覆蓋) 隱藏;下面就看一下 重載 重寫 隱藏的區別:
1、重載的特征:在同一個類中;函數名字相同;參數不同;virtual 關鍵字可有可無。
2、重寫(覆蓋)特征是:分別位於派生類與基類;函數名字相同;參數相同;基類函數必須有virtual 關鍵字(這點非常要注意)。
關於隱藏:
1、如果派生類的函數與基類的函數同名,但是參數不同。此時,不論有無virtual關鍵字,基類的函數將被隱藏(注意別與重載混淆)。
2、 如果派生類的函數與基類的函數同名,並且參數也相同,但是基類函數沒有virtual關鍵字。此時,基類的函數被隱藏(注意別與重寫混淆)。
// 06.cpp : 定義控制台應用程序的入口點。 // /************************************************************************/ /* 目的:找出重載、重寫、隱藏的區別 時間:2014年12月1日 19:06:03 */ /************************************************************************/ #include "stdafx.h" #includeusing namespace std; class Base { private: int x; public: virtual void mf1() = 0; virtual void mf1(int) //重載,在同一個類當中或者說同一個工作區間內。 { cout<<"調用基類的mf1函數"<
上面的代碼應該很好的解釋了三者的區別;在條款33裡面說道如果不想子類隱藏父類的函數,那麼在子類當中用using 聲明式達到目標:
class Derived:public Base { public: virtual void mf1() { cout<<"調用子類的mf1函數"<