Здесь есть несколько проблем, которые могут быть опечатками:
- пропущенная точка с запятой после класса
Derived
- в конструкторе
Derived(derivdata) : Base(derivdata){}
типа derivdata
пропал, отсутствует. (в c ++ отсутствует int по умолчанию) - вам не хватает пространства имен
std::
перед cout
и endl
в Derived::printData
- в
Derived::printData
элемент _data
недоступен, потому что он закрыт для Base
(Вы можете сделать его защищенным или написать для него геттер)
Основная проблема заключается в следующем приведении: Base* basevar = static_cast<Base>(*var);
Это фактически разыменовывает значениеиз var
, затем попытайтесь привести это значение к Base
, а затем попытайтесь присвоить результат (типа Base
) переменной типа Base*
.
Для полиморфного преобразования вы можетеиспользуйте dynamic_cast : Base* basevar = dynamic_cast<Base*>(var);
Но не ожидайте, что basevar->printData();
напечатает «Base», так как указатель все еще указывает на экземпляр Derived
и метод объявленvirtual
.
Чтобы получить доступ к методу базового класса, вам нужно явно указать компилятору сделать это: basevar->Base::printData();
(печатает "Base5")