且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

dynamic_cast

更新时间:2022-07-02 04:59:41

#include <typeinfo>
using std::bad_cast;

#include <iostream>
using std::cout; using std::endl;

struct A { virtual ~A() { } };
struct B : virtual public A { /* . . . */ };
struct C : public B { /* . . . */ };
struct D : public B, virtual public A { /* . . . */ };

void exercises() {
    A *pa = new C;
    if (B *pb = dynamic_cast< B* >(pa))
         cout << "cast from C to B* ok" << endl;
    else
         cout << "cast from C to B* not ok" << endl;
    B *pb = new B;
    if (C *pc = dynamic_cast< C* >(pb))
         cout << "cast from B to C* ok" << endl;
    else
         cout << "cast from B to C* not ok" << endl;

    A *pc = new C;
    if (B *pb = dynamic_cast< B* >(pc))
         cout << "cast C to B* ok" << endl;
    else
         cout << "cast C to B* not ok" << endl;

    A *pd = new D;
    if (B *pb = dynamic_cast< B* >(pd))
         cout << "cast D to B* ok" << endl;
    else
         cout << "cast D to B* not ok" << endl;
}

struct Base {
   virtual ~Base() {};
};

struct Derived: public Base { };

void cast_to_ref(const Base &b)
{
    try {
        const Derived &d = dynamic_cast<const Derived&>(b);
    cout<<"success"<<endl;
    // use the Derived object to which b referred
    } catch (bad_cast) {
        cout << "called f with an object that is not a Derived" << endl;
    }
}

int main()
{
    Base *bp; 
    bp = new Derived;  // bp actually points to a Derived object
    if (Derived *dp = dynamic_cast<Derived*>(bp)) 
    {
        // use the Derived object to which dp points
    } else {  // bp points at a Base object
        // use the Base object to which bp points
    }

    exercises();
    
    cast_to_ref(*bp);
    cast_to_ref(Base());
}

j结果如下:

cast from C to B* ok
cast from B to C* not ok
cast C to B* ok
cast D to B* ok
success
called f with an object that is not a Derived