1. 程式人生 > >《Effective C++》繼承與面對對象設計:條款32-條款40

《Effective C++》繼承與面對對象設計:條款32-條款40

參數 缺省參數 問題 ase 子類 void ive 條款33 作用域

條款32:確定你的public繼承塑模出is-a關系

  • public繼承意味著is-a。適用於base class身上的每一個函數也一定適用於derived class。

條款33:避免遮掩繼承而來的名稱

幾層作用域:

  • global作用域
    • namespace作用域
      • Base class作用域
        • Drive class作用域
          • 成員函數
            • 控制塊作用域

當前作用域會遮掩上一層作用域的名稱(重載的函數也會直接遮掩)

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