Поскольку вы используете защищенное наследование для внешнего мира, derived
не является производным от base
, только derived
и его подклассы знают, что оно получено из base
.
Следовательно:
base *ptr;
derived obj;
ptr=&obj;
Присваивает derived*
совершенно не связанный тип base*
. Если вы хотите, чтобы derived
был преобразован в base
, вам нужно использовать public
наследование, protected
наследование намеренно скрывает ваш базовый класс от внешнего мира.