【问题标题】:Which casting technique is better for doing casting from upper class to lower class in C++哪种转换技术更适合在 C++ 中进行从上层到下层的转换
【发布时间】:2011-02-15 00:50:14
【问题描述】:

我想从上类指针转换到下类,即从基类指针到派生类指针。

我应该使用“Dynamic_cast”还是“reinterpret_cast”?请给我建议

【问题讨论】:

  • 您应该删除“qt”标签,因为这个问题与 Qt 无关;)
  • 感谢 ereOn.. 我认为 hjhill 已经编辑并删除了 Qt 标签 :) 感谢 hjhill
  • @Solitaire:你为什么需要沮丧?这有时是必要的,但它也是一种气味(即有问题的设计的迹象)。
  • @outis:在我的应用程序中,有一个 API“QAbstractItemDelegate * QAbstractItemView::itemDelegate ()”。我有 listview,它继承了“QAbstractItemView”,myview 是 listview 对象,如果我做 myview- >itemDelegate(),我必须分配给我的委托指针,即类型转换是必要的..所以我认为它就像向下转换一样。
  • @Solitaire:为什么不能分配给QAbstractItemDelegate * 类型的变量? QAbstractItemDelegate 类缺少什么?

标签: c++ polymorphism casting


【解决方案1】:

reinterpret_cast 是最后的手段,应该避免。

在 Qt 中,如果在 QObject 之间进行转换,请使用 qobject_cast。它在语义上类似于 dynamic_cast,但在 dll 边界等方面没有问题。

【讨论】:

    【解决方案2】:

    补充 Ereon 的答案:如果您不知道类型,请使用 dynamic_cast 通过捕获 bad_cast 异常来进行运行时类型检查。

    【讨论】:

    • 但是如果不是dynamic_cast类型他会得到一个空指针。
    【解决方案3】:

    这取决于你对指针的了解。

    如果您确定知道您拥有的指针属于子类型,您可以安全地static_cast<> 它。

    如果您不确定,请使用dynamic_cast<>,但这需要成本并且速度较慢。

    【讨论】:

      【解决方案4】:

      不要使用reinterpret_cast - 使用static_cast 或dynamic_cast。如果您确定指针正好指向派生类对象,请使用static_cast,否则使用dynamic_cast(这将要求基类是多态的)并检查结果以确保指针确实指向该类你想要的。

      【讨论】:

      • 你的意思是,对于向上投射和向下投射,static_cast 更好?或者我什么时候必须使用 static_cast 或 dynamic_cast?
      • 对于“向上投射”,您根本不需要使用演员表。 Derived *dptr = something; Base *bptr = dptr; 工作正常。
      • 好吧,好吧..如果我确定我要进行上抛,我不会使用任何抛投,对于下抛,我总是更喜欢static_cast..但是Dynamic_cast有什么用呢?当我也必须使用“reinterprit_cast”时?
      • dynamic_cast 用于当您不知道Base* 指向的东西是否真的是Derived 对象,并且您想找出(并获得Derived*指针,如果是这样)。它很少需要。 reinterpret_cast 永远不应该用于相关指针类型之间的转换。在某些情况下(例如多重继承),它会给出“错误”的答案,例如给你一个 Derived* 指针,如果你将它用作 Derived* 会崩溃。
      • @sharptooth:嗯,它和 static_cast 的效果一样,因为 static_cast 被定义为能够执行标准转换:比较 4.10/3 和 5.2.9/2。我说你不需要强制转换的原因只是强制转换根据定义是一种显式转换,这是一种隐式转换。但是是的,可以隐式转换的类型之间的static_casts,和隐式转换,其实是一回事。
      猜你喜欢
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 2019-09-02
      相关资源
      最近更新 更多