如果我想让一个类具有适应性,并且可以从外部选择不同的算法——C++ 中最好的实现是什么?
我主要看到两种可能性:
- 使用抽象基类并传入具体对象
- 使用模板
这是一个小例子,在各种版本中实现:
版本 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。
你能评论一下这些可能性吗?