Отсутствие какой-либо виртуальной функции в классе не делает ее не пригодной для использования в качестве базового класса.По моему мнению, добавление virtual
функций к базовому классу является своего рода особенным случаем превращения базового класса в полиморфный.Многие программисты небрежно помещают virtual
в функции, и особенно в деструктор класса (и отмечают, что «Виртуальный деструктор необходим» ).
ATL, например, сильно зависит от наследования, но не имеет никаких виртуальных функций.(Базовые) классы не являются полиморфными.Большинство (если не все) классов C ++ / STL являются неполиморфными.
Можно нарушить правило «Предпочитать сдерживание / составление над наследованием» и наследовать класс в нелогичной форме (приведен один примерпо lubgr);но это выполнимо и действует.Иногда более уместно наследовать от неполиморфного класса, а не содержать класс.
Классы Template / Template-meta полагаются на наследование, когда не задействованы никакие виртуальные функции.Атрибут-наследование является одним из примеров, где класс наследовал бы от различных классов (мульти-наследование) и наследовал атрибуты.
Один очень простой пример - сделать класс non_copyable
, поместить конструктор копирования / оператор присваивания и т. Д. Как private / protected;и пусть другие классы наследуют от него.Таким образом, «производный» класс унаследует не копируемые «возможности / атрибут» базового класса.