2009-11-27 84 views
0

我读了几篇关于使用静态和动态演员的专题文章When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?以下C++转换是否正确?

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

这是在继承层次向上铸造

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; 

} 

*衍生实际上是从基类派生类。

在下面的代码中向下投射如何?

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; 

} 

如果上述两个MACROS通过Base和Derived类交换传递,会有什么影响?

+0

是基础派生的相关类型吗? – Naveen 2009-11-27 17:49:53

回答

4

如果Base确实是Derived的基类,则绝对不需要任何类型转换,这意味着在上面的代码中static_cast是绝对多余的。它没有实现任何仅仅指派不会隐含的任何事情。此外,在upcasts(从派生到基地),dynamic_cast是绝对等于static_cast,这意味着dynamic_cast也不会实现任何新的。

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

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

+0

是的。如果有人将参数Base和Base的Derived类传递给参数Derived,那么这将很有趣。 – Naveen 2009-11-27 18:01:49

+0

好玩吗?你能解释一下这个影响吗? – chrisgayle 2009-11-27 18:14:19

+0

影响是,如果'Derived'实际上是从'Base'派生出来的,你可以反向传递它们(作为派生的base和base派生),函数什么都不会说 - 它只是悄悄地做一个unchecked downcasts。如果事实证明'Base'指针并不是真的指向'Derived'实例,那么这个downcast的结果就没有意义了。然而,你的功能不会说什么。如果你只想把你的功能用于upcasts,不要做任何明确的转换。 – AnT 2009-11-27 18:19:24

0

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

0

假设Derived是从Base派生的,尽管正确是不必要的。您可以直接将hd.get()的结果分配给Base*