ИМО, это открыто для спора. До шаблонов было значительное количество случаев, которые оправдывали это. По сути, вы можете использовать базовые классы примерно так же, как вы можете использовать классы политики с шаблонами. Например, рассмотрим шаблон вроде:
template <typename policy1, typename policy2>
class whatever {
policy1 p1;
policy2 p2;
public:
void dosomething() { if (p1.enquire()) p2.dosomething(); }
};
Если вы по какой-то причине не хотите использовать шаблоны, вы можете получить (некоторые) довольно похожие возможности с множественным наследованием:
class whatever : policy1, policy2 {
void dosomething() { if (enquire()) dosomething(); }
};
В обоих случаях вы в основном встраиваете экземпляр «policy» в ваш новый объект. Так как мы используем частное наследование, LSP не беспокоится - как и в случае шаблонов на основе политик, цель состоит не в том, чтобы создать большую иерархию, которая утверждает что-либо о взаимоотношениях между членами иерархии, скорее просто о создании способности создавать большое разнообразие не связанных между собой классов по требованию.