我特意从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会有什么影响?
答案 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*