Проблема в том, что вы используете частное наследование; это означает, что наследование можно увидеть только внутри вашего класса (в данном случае derived
). Вы не можете указать base*
на derived
экземпляр вне вашего класса (в данном случае main()
), потому что наследование (и, следовательно, преобразование) не доступно.
Это то же самое, что пытаться получить доступ к закрытому члену вне класса.
На самом деле название «частное наследование» вводит в заблуждение, поскольку оно не реализует настоящее наследование. В вашем примере экземпляр derived
не является base
; это просто реализовано в терминах base
, и это то, что означает «частное наследование». Если у вас возникает соблазн использовать частное наследование, вам следует рассмотреть возможность использования простого агрегирования (то есть частного указателя на base
внутри derived
). В большинстве случаев (в большинстве случаев, не всегда) частное наследование не дает никаких преимуществ и имеет некоторые тонкие проблемы.