static_cast <Derived*>(Base pointer)是否会产生编译时错误?

san*_*eep 13 c++ casting

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.