static_cast(Base pointer)应该给出编译时错误吗?
class A
{
public:
A()
{
}
};
class B : public A
{
public:
B()
{
}
};
int main()
{
A *a=new A();
B * b=static_cast<B*>(a); // Compile Error?
}
Run Code Online (Sandbox Code Playgroud)
Abh*_*hay 15
它不能给出编译时错误,因为Base-Derived关系可以在运行时存在,具体取决于要转换的指针的地址.
static_cast总是成功,但如果不转换为正确的类型,将引发未定义的行为.dynamic_cast可能会失败或者没有,实际上告诉你是否你试图转换成正确的类型.
因此,在我看来,只有在设计能够确定存在这种可能性的情况下才static_cast应该用于向下转换.一个很好的例子是CRTP.所以它在某些情况下是合乎逻辑的,但是尽量避免它,因为它是未定义的行为.
不需要RTTI static_cast可以使它在理论上更快,但我会随时交易一个可能导致dynamic_cast的未定义行为static_cast!
Pet*_*der 13
它没有给出编译时错误,因为强制转换非常有效,而且你经常在实践中这样做,例如:
A* a = new B;
B* b = static_cast<B*>(a); // OK
Run Code Online (Sandbox Code Playgroud)
在您的代码中,就编译器而言,您正在做同样的事情.它无法知道转换是无效的,所以它允许它在编译时.但是,在运行时,只要您尝试使用B实例上的某个功能,就会遇到一些令人讨厌的错误A.
| 归档时间: |
|
| 查看次数: |
9545 次 |
| 最近记录: |