ikautak.log

C/C++, Python, CUDA, Android, Linux kernel, Network, etc.

More Effective C++ 項目25 コンストラクタと非メンバー関数を仮想化する

新訂版 More Effective C++ (AddisonーWesley professional co)

新訂版 More Effective C++ (AddisonーWesley professional co)

  • 作者: スコット・メイヤーズ,安村通晃,伊賀聡一郎,飯田朱美,永田周一
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2007/06/29
  • メディア: 単行本(ソフトカバー)
  • 購入: 8人 クリック: 129回
  • この商品を含むブログ (43件) を見る

項目25 コンストラクタと非メンバー関数を仮想化する

コンストラクタを仮想っぽくするためには、コンストラクタ内で入力によって異なるオブジェクトを返す関数を呼ぶとよい。
与えられた入力によって、異なるタイプのオブジェクトを生成する関数を仮想コンストラクタと呼ぶ。

仮想コピーコンストラクタは、それを呼び出すオブジェクトの新しいコピーを返す。
たいていcloneやcopySelfといった名前で、自分をnewして返す関数であり、基底クラスのポインタ経由でも仮想的にオブジェクトのclone()が呼ばれる。

非メンバー関数を仮想っぽくするには、パラメータにインターフェース・抽象クラスを渡し、内部で仮想関数を呼び出すだけ。

class A {
public:
  virtual ostream& print(ostream& s) const = 0;
  ...
};

class B : public A {
public:
  virtual ostream& print(ostream& s) cosnt;
  ...
};

class C : public A {
pubilc:
  virtual ostream& print(ostream& s) const;
  ...
};

inline ostream& operator<<(ostream& s, const A& a) {
  return a.print(s); // 仮想関数を呼ぶだけ
}