在上面的代码中,我应该使用
dynamic_cast
但是使用static_cast
不正确.static_cast
不应该在向下转换时使用,因为编译器无法确定我们正在进行正确的转换.
具有讽刺意味的dynamic_cast
是,由于你的类型不是多态的,所以实际上这里的形式不合理.
那说,static_cast
当然可以用来垂头丧气.你是正确的,编译器不能进行类型检查,但在很多情况下,你有一个Base*
并知道它指向a Derived*
,所以你可以手动进行转换.一个非常常见的案例是CRTP:
templateclass Base { Derived& self() { return *static_cast (this); } // ... }; class Foo : Base { ... };
Base
是总是一个T
,让垂头丧气是安全的.
的优势static_cast
比dynamic_cast
是static_cast
是免费的,但dynamic_cast
价格昂贵.C++的口头禅不会为你不需要的东西买单.