Джеспер уже хорошо ответил на вопрос, но я подумал, что смогу предоставить контекст, ответив на ваш конкретный c пример
Derived *derived = new Base
, а затем вы скажете: «это следует разрешить, поскольку производный указатель может содержать все функции из базы без какой-либо потери данных, верно? "
это правда, что если бы вы вызвали derived->SomeBaseMethod()
вещи могли работать (теоретически), но что должно произойти, если вы попытались вызвать какой-то метод, который существовал только на Derived
? derived->SomeDerivedMethod()
. Поскольку фактический тип, на который указывает указатель, является объектом Base
, не будет производного метода для выполнения.
Теперь, если у вас есть Base* b = new Derived
, то компилятор позволит вам вызывать base
методы только на b
(который будет определен для всех Derived
объектов), но не позволит вам вызывать какие-либо производные методы, поскольку тип b
равен base
. Следовательно, это будет безопасно, тогда как Derived* d = new Base
не будет