c++ - C++ 中 dynamic_cast 运算符的强制必要性

标签 c++ casting dynamic-cast

dynamic_cast 通常在我们有一个基类指针并想将其向下转换为派生类时使用。例如,

class A
{
      public:
      virtual void foo();
};

class B : public A 
{
      public:
      void foo();
};

main()
{
    A* a = new B();
    B* b = dynamic_cast<B*> (a);
}

但是,使用C-style cast 也可以实现同样的效果:

B* b = (B*)a;

那么,我的问题是在什么情况下/情况下完全有必要使用此运算符,即没有其他选择?

最佳答案

But, the same can also be accomplised by using C-style cast:

不,它不能:)

根据定义,C 风格转换将尝试执行一系列的const_caststatic_castreinterpret_cast1 以实现您想要的转换,但不是 dynamic_cast。所以,基本上,这里的 C 风格转换等同于 static_cast,如果实际动态类型不匹配,它将具有未定义的行为(相反,在这种情况下,动态转换将返回 nullptr 在指针的情况下抛出 std::bad_cast 在引用的情况下)。

也就是说,如果您确定正在转换为正确的类型,那么使用static_cast(或 C 风格的转换,但我个人认为不喜欢)。但是,如果您不确定,则使用 dynamic_cast

1 C-Style cast 也可用于转换为私有(private)基,这是前面提到的一系列 C++-Style casts 无法做到的

关于c++ - C++ 中 dynamic_cast 运算符的强制必要性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17597859/

相关文章:

c++ - 为什么这个 ASIO 示例使用成员变量来传递状态而不是使用绑定(bind)?

c++ - 液晶屏旋转1位位图

swift - 类型转换与快速转换相同吗?

Java:当 B 实现 A 时从 List<B> 转换为 List<A>?

用于后期绑定(bind)错误的 C++ dynamic_cast - 切片

java - 类转换异常

c++ - 在 boost::asio 中,为什么异步接受处理程序需要重新启动异步接受?

c++ - 在 C++ 中为 filesystem::copy 使用多个复制选项

c# - 为什么我不能将派生泛型类型转换为基本非泛型类型(通过约束)?

ios - 将新对象插入数据库时​​出现 SwiftdynamicCast 错误