クラスを適応可能にし、外部からさまざまなアルゴリズムを選択できるようにしたい場合、C++ での最適な実装は何ですか?
主に2つの可能性があります。
- 抽象基本クラスを使用し、具体的なオブジェクトを渡します
- テンプレートを使用する
以下は、さまざまなバージョンで実装された小さな例です。
バージョン 1:抽象基本クラス
class Brake {
public: virtual void stopCar() = 0;
};
class BrakeWithABS : public Brake {
public: void stopCar() { ... }
};
class Car {
Brake* _brake;
public:
Car(Brake* brake) : _brake(brake) { brake->stopCar(); }
};
バージョン 2a:テンプレート
template<class Brake>
class Car {
Brake brake;
public:
Car(){ brake.stopCar(); }
};
バージョン 2b:テンプレートとプライベート継承
template<class Brake>
class Car : private Brake {
using Brake::stopCar;
public:
Car(){ stopCar(); }
};
Java 出身の私は当然、常にバージョン 1 を使用する傾向がありますが、STL コードなどでは、テンプレート バージョンが好まれることが多いようです。それが本当なら、メモリ効率など(継承なし、仮想関数呼び出しなし)のためだけですか?
バージョン 2a と 2b の間に大きな違いはないことを認識しています。 C++ FAQを参照してください。
これらの可能性についてコメントいただけますか?