Является ли наследование от неабстрактного класса плохим ООП?

Является ли наследование от неабстрактного класса плохим ООП?
Является ли наследование от неабстрактного класса плохим ООП? - billy_huy @ Unsplash

Проблема в том, что наследование от класса без виртуальных методов вызовет у вас проблемы, если вы наследуете от него и перезаписываете любой из методов, а если вы не перезаписываете ни один из методов, зачем тогда вам наследовать от него? Проблема в том, что в методах C++, которые не помечены как виртуальные, вы не сможете использовать полиморфизм, фундаментальный для объектно-ориентированного программирования. Только виртуальные методы имеют vtable, которая позволит базовому классу вызывать перезаписанный метод.

Если класс не сделан абстрактным или не имеет виртуального деструктора, он не подготовлен для наследования от него, и справедливо предположить, что автор класса не намеревается наследовать от него. При разработке на Java я часто утверждаю, что классы должны быть либо abstract, либо final, просто чтобы обеспечить это. В C++ ключевое слово final было введено позже, но я считаю, что его следует использовать чаще по той же причине.

Вы упомянули, что вы наследуете от классов, чтобы добавлять к ним методы, и, если я вас правильно понимаю, вы добавляете методы, которых нет в базовом классе, поэтому вы не перезаписываете методы, а просто добавляете новые методы. Делая это, вы создаете класс с новой функциональностью, которая тесно связана с классом, который вы расширяете. В этом случае лучшим подходом было бы использовать Композицию вместо наследования.

Короче говоря, концепция, которую вы, возможно, нарушаете, — это полиморфизм. И чтобы ответить на заглавный вопрос: да, наследование от неабстрактного класса, скорее всего, неправильное дизайнерское решение.

Рекомендую посмотреть эти видео для лучшего погружения в вопрос:

Прикрепленное видео 1 - Наследование в ООП пример. Что такое наследование. Для чего нужно наследование классов. ООП. C++ - 98

Прикрепленное видео 2 - ООП С++ с нуля: урок 7 - наследование классов


LetsCodeIt, 18 января 2023 г., 18:49