使用可以将指向基类的指针转换为指向派生类的指针static_cast。static_cast不执行任何运行时检查,并且当指针实际上未指向所需类型时,可能导致未定义的行为。
struct Base {}; struct Derived : Base {}; Derived d; Base* p1 = &d; Derived* p2 = p1; //错误; 需要演员 Derived* p3 = static_cast<Derived*>(p1); //好; p2现在指向派生对象 Base b; Base* p4 = &b; Derived* p5 = static_cast<Derived*>(p4); // 未定义的行为,因为p4不 // 指向派生对象
同样,可以使用将对基类的引用转换为对派生类的引用static_cast。
struct Base {}; struct Derived : Base {}; Derived d; Base& r1 = d; Derived& r2 = r1; //错误; 需要演员 Derived& r3 = static_cast<Derived&>(r1); //好; r3现在引用派生对象
如果源类型是多态的,dynamic_cast则可用于执行从基数到派生的转换。它执行运行时检查,并且可以恢复故障,而不产生不确定的行为。在指针的情况下,失败时将返回空指针。在参考案例中,类型std::bad_cast(或从派生的类std::bad_cast)失败时将引发异常。
struct Base { virtual ~Base(); }; // 基是多态的 struct Derived : Base {}; Base* b1 = new Derived; Derived* d1 = dynamic_cast<Derived*>(b1); //好; d1指向派生对象 Base* b2 = new Base; Derived* d2 = dynamic_cast<Derived*>(b2); // d2是空指针