В C ++ вы должны делать класс наследуемым только в том случае, если вы намереваетесь использовать его полиморфно. То, как вы относитесь к полиморфным объектам в C ++, сильно отличается от того, как вы относитесь к другим объектам. Вы не склонны помещать полиморфные классы в стек, передавать их или возвращать из функций по значению, поскольку это может привести к нарезке . Полиморфные объекты имеют тенденцию выделяться в куче, передаваться и возвращаться по указателю или по ссылке и т. Д.
Если вы разрабатываете класс, который не наследуется, а затем наследуется от него, вы вызываете всевозможные проблемы. Если деструктор не помечен как виртуальный, вы не можете удалить объект через указатель базового класса, не вызвав неопределенного поведения. Без функций-членов, помеченных virtual
, они не могут быть переопределены в производном классе.
Как правило, в C ++ при разработке класса определяется, хотите ли вы, чтобы он был унаследован. Если вы это сделаете, отметьте соответствующие функции virtual
и присвойте ему деструктор virtual
. Вы также можете отключить оператор назначения копирования, чтобы избежать нарезки. Точно так же, если вы хотите, чтобы класс не был наследуемым, не предоставляйте ему ни одну из этих функций. В большинстве случаев это логическая ошибка - наследовать от класса, который не предназначен для наследования, и в большинстве случаев вы можете захотеть сделать это, вы часто можете использовать состав вместо наследования для достижения этот эффект.