#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
}
I2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxpb3N0cmVhbT4KdXNpbmcgc3RkOjpjb3V0OyAgICB1c2luZyBzdGQ6OmVuZGw7CgpzdHJ1Y3QgQSB7CiAgICB2aXJ0dWFsIH5BKCkgbm9leGNlcHQgPSBkZWZhdWx0Owp9OwoKc3RydWN0IEIgOiB2aXJ0dWFsIHB1YmxpYyBBIHsKICAgIHZpcnR1YWwgfkIoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7Cn07CgpzdHJ1Y3QgQzEgOiBwdWJsaWMgQiB7CiAgICB2aXJ0dWFsIH5DMSgpIG5vZXhjZXB0ID0gZGVmYXVsdDsKfTsKCnN0cnVjdCBDMiA6IHB1YmxpYyBCIHsKICAgIHZpcnR1YWwgfkMyKCkgbm9leGNlcHQgPSBkZWZhdWx0Owp9OwoKc3RydWN0IEQgOiBwdWJsaWMgQzEsIHB1YmxpYyBDMiB7CiAgICB2aXJ0dWFsIH5EKCkgbm9leGNlcHQgPSBkZWZhdWx0Owp9OwoKaW50IG1haW4oKSB7CiAgICBBICpwdHIgPSBudWxscHRyOwogICAgcHRyID0gbmV3IEQ7CiAgICBjb3V0IDw8ICJwdHIgPSAiIDw8IHB0ciA8PCBlbmRsOwogICAgCiAgICBjb3V0IDw8ICJkeW5hbWljX2Nhc3Q8RCo+KHB0cikgPSAiIDw8IGR5bmFtaWNfY2FzdDxEKj4ocHRyKSA8PCBlbmRsOyAgLy8gbGVnYWxseSBkb3duY2FzdAogICAgY291dCA8PCAiZHluYW1pY19jYXN0PEIqPihwdHIpID0gIiA8PCBkeW5hbWljX2Nhc3Q8Qio+KHB0cikgPDwgZW5kbDsgIC8vIGFtYmlnaW91cyBzdWItY2xhc3MgQiAvLyBkb3duY2FzdCBmYWlsZWQKICAgIAogICAgY291dCA8PCAiLS0tLS0tLS0tLVxuIjsKICAgIAogICAgQzEgKnB0ckMxID0gbnVsbHB0cjsKICAgIHB0ckMxID0gZHluYW1pY19jYXN0PEMxKj4ocHRyKTsKICAgIGNvdXQgPDwgInB0ckMxID0gZHluYW1pY19jYXN0PEMxKj4ocHRyKSA9ICIgPDwgcHRyQzEgPDwgZW5kbDsKICAgIAogICAgY291dCA8PCAiXHQiIDw8ICJkeW5hbWljX2Nhc3Q8Qio+KHB0ckMxKSA9ICIgPDwgZHluYW1pY19jYXN0PEIqPihwdHJDMSkgPDwgZW5kbDsKICAgIAogICAgLy8gZHluYW1pY19jYXN0IEAgTVNETu+8miBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvY2J5OWt5Y3MuYXNweAp9CgoK