Проблема в том, что наследование от класса без виртуальных методов вызовет у вас проблемы, если вы наследуете от него и перезаписываете любой из методов, а если вы не перезаписываете ни один из методов, зачем тогда вам наследовать от него? Проблема в том, что в методах C++, которые не помечены как виртуальные, вы не сможете использовать полиморфизм, фундаментальный для объектно-ориентированного программирования. Только виртуальные методы имеют vtable, которая позволит базовому классу вызывать перезаписанный метод.
Если класс не сделан абстрактным или не имеет виртуального деструктора, он не подготовлен для наследования от него, и справедливо предположить, что автор класса не намеревается наследовать от него. При разработке на Java я часто утверждаю, что классы должны быть либо abstract
, либо final
, просто чтобы обеспечить это. В C++ ключевое слово final
было введено позже, но я считаю, что его следует использовать чаще по той же причине.
Вы упомянули, что вы наследуете от классов, чтобы добавлять к ним методы, и, если я вас правильно понимаю, вы добавляете методы, которых нет в базовом классе, поэтому вы не перезаписываете методы, а просто добавляете новые методы. Делая это, вы создаете класс с новой функциональностью, которая тесно связана с классом, который вы расширяете. В этом случае лучшим подходом было бы использовать Композицию вместо наследования.
Короче говоря, концепция, которую вы, возможно, нарушаете, — это полиморфизм. И чтобы ответить на заглавный вопрос: да, наследование от неабстрактного класса, скорее всего, неправильное дизайнерское решение.
Рекомендую посмотреть эти видео для лучшего погружения в вопрос: