dynamic_cast
не работает по двум причинам.
Во-первых, как вы уже догадались, вам нужны виртуальные функции, чтобы dynamic_cast
работал , то есть базовый тип myclass
должен быть полиморфным.
Другая причина также касается вашего второго вопроса. В вашем коде derivedclass
наследуется от myclass
. Это означает, что любой объект типа derivedclass
также является объектом типа myclass
. не подразумевает, что любой объект типа myclass
обязательно также имеет тип derivedclass
, который, как вы, похоже, предполагаете.
// creates a new instance of myclass, NOT an instance of derivedclass
myclass* p= new myclass;
// assuming myclass is polymorphic, returns a type-safe pointer to a derivedclass object
// if p is not such an object, returns nullptr, which is useful for error checking
derivedclass* pd1 = dynamic_cast<derivedclass*>(p);
// this is very unsafe! pd2 is now a 'wild' pointer to an object that doesn't exist
derivedclass* pd2 = static_cast<derivedclass*>(p);
// this is Undefined Behavior: there is no such `b` in memory at pd2, and that memory
// is not yours to read from
cout << pd2->b << endl;
Причина, по которой pd->b
не является -2
, заключается в том, что конструктор derivedclass
никогда не выполнял . Вы никогда не создавали объект derivedclass
.