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

struct A {
    virtual ~A() noexcept = default;
};

struct B : virtual public A {
    virtual ~B() noexcept = default;
};

struct C1 : public B {
    virtual ~C1() noexcept = default;
};

struct C2 : public B {
    virtual ~C2() noexcept = default;
};

struct D : public C1, public C2 {
    virtual ~D() noexcept = default;
};

int main() {
    A *ptr = nullptr;
    ptr = new D;
    cout << "ptr = " << ptr << endl;
    
    cout << "dynamic_cast<D*>(ptr) = " << dynamic_cast<D*>(ptr) << endl;  // legally downcast
    cout << "dynamic_cast<B*>(ptr) = " << dynamic_cast<B*>(ptr) << endl;  // ambigious sub-class B // downcast failed
    
    cout << "----------\n";
    
    C1 *ptrC1 = nullptr;
    ptrC1 = dynamic_cast<C1*>(ptr);
    cout << "ptrC1 = dynamic_cast<C1*>(ptr) = " << ptrC1 << endl;
    
    cout << "\t" << "dynamic_cast<B*>(ptrC1) = " << dynamic_cast<B*>(ptrC1) << endl;
    
    // dynamic_cast @ MSDN： http://msdn.microsoft.com/en-us/library/cby9kycs.aspx
}


