以下C ++转换是否正确?

时间:2009-11-27 17:45:50

标签: c++ casting

我特意从When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?

读了几篇关于静态和动态演员表用法的帖子

我对以下方式使用演员表有疑问。有人可以验证下面提到的代码: -

这是继承层次结构中的向上转换

template<class Base, class Derived>

inline Handle<Base> STATIC_CAST(Handle<Derived> hd) {

  Handle<Base> hb;

  Derived* dp = hd.get(); // Assume this gives pointer of derived class object

  Base* bp = static_cast<Base*> (dp);

  if(bp) {

     hb = Ptr2Handle(bp); // Assume this give reference to Handle 

  }

  return hb;

}

* Derived实际上是Base类的派生类。

以下代码中的向下转换怎么样?

template<class Base, class Derived>

inline Handle<Derived> DYNAMIC_CAST(Handle<Base> hb) {

  Handle<Derived> hd;

  Base* bp = hb.get();

  Derived* dp = dynamic_cast<Derived*> (bp);

  if(dp) {

     hd = Ptr2Handle(dp);

  }

  return hd;

}

如果在交换Base和Derived类的情况下传递上述两个MACROS会有什么影响?

3 个答案:

答案 0 :(得分:4)

如果Base确实是Derived的基类,则绝对不需要任何强制转换,这意味着上述代码中的static_cast绝对是多余的。它没有实现任何仅仅是赋值不会隐含的东西。此外,在upcast(从派生到基础)中,dynamic_cast绝对等同于static_cast,这意味着dynamic_cast也不会达到任何新的效果。

实际上,通过在该代码中放置明确的static_cast强制转换,其作者启用了强制“反向”强制转换(向下转换)。即您可以使用此代码从基类转换为派生类。我不知道这是否是意图(我怀疑是这样,通过模板参数名称来判断),如果不是,那么完全删除强制转换可能是个好主意,因为它很危险。

如果我怀疑,代码实际上应该支持向下转换,那么dynamic_cast可能确实有助于捕获潜在的错误。但是,请记住dynamic_cast仅适用于具有多态类类型的向下转换。

答案 1 :(得分:0)

层次结构中向上(在祖先方向上)的static_cast始终是合法的。该演员表是合法的(假设Base和Derived是类)iff Base是Derived的基类。

答案 2 :(得分:0)

假设Derived来自Base演员虽然没有必要。您可以直接将hd.get()的结果分配给Base*