Если я хочу, чтобы класс адаптировался и позволял выбирать разные алгоритмы извне - какова наилучшая реализация в С++?
Я вижу в основном две возможности:
- Используйте абстрактный базовый класс и передайте конкретный объект в
- Использовать шаблон
Вот небольшой пример, реализованный в различных версиях:
Версия 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, см. Часто задаваемые вопросы по С++.
Можете ли вы прокомментировать эти возможности?