Неудачное приведение в C++
Приведение вниз имеет смысл только если объект действительно того типа, к которому мы сужаем указатель.
Для указателя dynamic_cast при неудаче возвращает
пустой адрес. Его записывают nullptr: объекта
по этому адресу нет. Так не вызывают метод потомка
у чужого объекта. Запишем обычный User, попробуем
получить Student* и выведем результат проверки:
class User {
public:
virtual ~User() {
}
};
class Student : public User {
};
Создадим объект User и попробуем привести указатель вниз:
int main() {
User* base = new User();
Student* student = dynamic_cast<Student*>(base);
if (student) {
std::cout << "student\n";
} else {
std::cout << "not student\n";
}
delete base;
return 0;
}
Сохраните в User* объект базового класса,
попробуйте привести его к Employee*
и выведите сообщение, если указатель
оказался пустым.