#include <iostream>
class Base {
};
class Derived : public Base {
};
int main() {
Base* bptr = new Derived();
Derived* dptr = static_cast<Derived*>(bptr);
std::cout << dptr << std::endl;
}
В приведенном выше коде я должен использовать dynamic_cast, но я неправильно использую static_cast. static_cast никогда не должен использоваться в то время как downcasting, поскольку у компилятора нет способа определить, что мы делаем правильно.C++ static_cast vs dynamic_cast
Почему это не ошибка компиляции? Я использую gcc 4.9.2. Вы, ребята, думаете, что это ошибка в компиляторе, или же стандарты C++ допускают такой код?
Редактировать: Спасибо за ответы. На самом деле, базовый класс выше - полиморфный , т. Е. Он имеет виртуальные функции, но я оставил их для этого примера. Я должен бросить в виртуальный деструктор в базе, чтобы было ясно, что он был полиморфным - мой плохой.
Вы можете использовать 'static_cast' от' Base * 'до 'Derived *', но вы правы, что он не будет выполнять проверку типов. Это все же полезно, хотя, если вы знаете каким-то другим способом, что этот указатель действительно указывает на объект 'Dervied'. Если 'Base *' на самом деле не указывает на 'Derived * ', то любое разыменование' Derived' ', вызванное' static_cast', вызовет неопределенное поведение. –
Во всей реальности это * точно * то, что для 'static_cast'is; в конце концов, преобразования в указатели базового класса/ссылки выполняются неявно. –