c++ - static_cast<Derived *>(Base pointer) 是否应该给出编译时错误?

标签 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?
}

最佳答案

它不会给出编译时错误,因为 Base-Derived 关系 可以在运行时存在,具体取决于被强制转换的指针的地址。 static_cast 总是成功,但如果你不转换为正确的类型,则会引发 undefined-behaviordynamic_cast 可能会失败,实际上会告诉您是否尝试转换为正确的类型。

所以在我看来,static_cast 应该用于downcast,前提是设计可以确定存在这种可能性。 CRTP 就是一个很好的例子。 .所以在某些情况下这是合乎逻辑的,但尽量避免它,因为它是未定义的行为。

static_cast 不需要 RTTI,这可能会使它理论上更快,但我会随时以 dynamic_cast 换取未定义的行为static_cast 可能会导致!

关于c++ - static_cast<Derived *>(Base pointer) 是否应该给出编译时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2469013/

相关文章:

c# - 在 C# 中从矩形数组中提取一维数组的最佳方法是什么?

c++ - 尝试编译 .dll 时,出现 interface 关键字错误

c++ - 静态线程安全和初始化顺序

c++ - 验证/识别字符串表示的 IP 地址的版本

c# - 迭代对象列表时避免多个 "if"语句 c#

java - Collection<Sub> 转换为 SuperCollection<Super>

c++ - 内存和范围管理

c++ - 采用原始指针的函数尝试通过引用接受指针,如错误消息中所述

c# - 类型转换一个物体有多昂贵?

python - 将指数表示法数字转换为字符串 - 解释