C++ 基础到派生的转换

示例

使用可以将指向基类的指针转换为指向派生类的指针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是空指针