《Effective C++》繼承與面對對象設計:條款32-條款40
阿新 • • 發佈:2019-01-02
參數 缺省參數 問題 ase 子類 void ive 條款33 作用域
條款32:確定你的public繼承塑模出is-a關系
- public繼承意味著is-a。適用於base class身上的每一個函數也一定適用於derived class。
條款33:避免遮掩繼承而來的名稱
幾層作用域:
- global作用域
- namespace作用域
- Base class作用域
- Drive class作用域
- 成員函數
- 控制塊作用域
- 成員函數
- Drive class作用域
- Base class作用域
- namespace作用域
當前作用域會遮掩上一層作用域的名稱(重載的函數也會直接遮掩)
class Base{ public: void f1(); } class Drive : public Base { public: void f1(int); //會遮掩f1(),子類並沒有繼承f1() } Drive d; d.f1(); //錯誤 d.f1(3); //正確
可以通過using聲明式(public繼承)或者inline轉交(public和private繼承)解決這一問題
class Base{
public:
void f1();
}
//using 聲明式
class Drive:public Base {
public:
using Base::f1;
void f1(int);
}
//inline轉交
class Drive : private Base {
public:
void f1(){
Base::f1();
}
void f1(int);
}
條款34:區分接口繼承和實現繼承
- 純虛函數(只提供接口)
- 純虛函數造成了抽象類,抽象類不可以構造實體(對象)
- Drived class中必須給出純虛函數的實現
- 純虛函數可以給出實現(類外)
- 虛函數(提供接口和缺省實現)
- 用於實現多態
- 非虛函數(提供了強制實現)
- 可以看成此類獨有,且最好不要在Drived class重新定義非虛函數
條款35:考慮virtual函數以外的其他選擇
條款36:絕不重新定義繼承而來的non-virtual函數
條款37:絕不要重新定義繼承而來的缺省參數值
條款38:通過復合塑模樹has-a 或“根據某物實現出”
條款39:明智而審慎的使用private繼承
條款40:明智而審慎的使用多重繼承
《Effective C++》繼承與面對對象設計:條款32-條款40