#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不应该被使用,而 向下投射。C++ static_cast vs dynamic_cast
为什么不是编译错误?我正在使用gcc 4.9.2。你们 认为这是编译器中的错误,还是C++标准允许这样的代码?
编辑:谢谢你的回应。实际上,上面的基类是多态的 ,即它具有虚函数,但在本例中我省略了它们。我应该 在基地虚拟析构函数中抛出,以明确它是 是多态 - 我的不好。
您可以从'Base *'的'static_cast' 'Derived *',但你是正确的,它不会执行任何类型检查。它仍然很有用,但如果通过其他方式知道该指针确实指向了“Dervied”对象。如果'Base *'实际上没有指向Derived *,那么由'static_cast'产生的Derived *'的任何解引用都会引发未定义的行为。 –
在所有现实中,这完全是* static_cast是什么;毕竟,转向基类指针/引用是隐式完成的。 –