Effective C++34インタフェースの継承と継承の区別

4656 ワード

public継承は根本的に言えば,インタフェース継承と実装継承の2つの部分がある.両者の前の違いは、関数宣言と関数定義に似ています.
具体的な設計では、derived classがメンバー関数のみを継承するインタフェース(純虚関数)の3つの形式が表示されます.derived classは関数のインタフェースと実装を同時に継承し、同時に書き換えることができる(override).derived classは、関数のインタフェースと実装を同時に継承しますが、関数の書き換えは許可されません.
 
1、メンバー関数のみを継承するインタフェース(純虚関数):
例えばpure関数
2、関数のインタフェースと実装を同時に継承し、同時に書き換えることができる(override):
例えばimpure関数は,ユーザがデフォルト実装を使用したくないが,その関数を書き換えることを忘れないようにするために,純粋な虚関数として宣言するが,デフォルト実装を与え,親クラスのデフォルト実装を使用したい場合は明示的に呼び出す必要があり,デフォルト宣言を使用したくない場合は自分で定義する必要があるniceのソリューションを提供する.
次の例のfly関数:
 1 class Airplane {  2 public:  3   virtual void fly(const Airport& destination) = 0;  4  ...  5 };  6 void Airplane::fly(const Airport& destination)  7 {  8     9 } 10 class ModelA: public Airplane { 11 public: 12   virtual void fly(const Airport& destination) 13  { Airplane::fly(destination); } 14  ... 15 }; 16 class ModelB: public Airplane { 17 public: 18   virtual void fly(const Airport& destination) 19  { Airplane::fly(destination); } 20  ... 21 }; 22 class ModelC: public Airplane { 23 public: 24   virtual void fly(const Airport& destination); 25  ... 26 }; 27 void ModelC::fly(const Airport& destination) 28 { 29  ModelC  30 }

 
3、同時に関数のインタフェースと実現を継承するが、この関数を書き換えることは許されない.
例えばnon−virtual関数では、この実装方法は不変性を強調する.すなわち、すべてのderived classはbase classの非虚関数を継承し、親クラスの関数の実装方法に従うべきである.