#include <cassert>
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 = new D;
assert(dynamic_cast<D*>(ptr) != nullptr); // ok
assert(dynamic_cast<B*>(ptr) == nullptr); // ambigious sub-class B
}
I2luY2x1ZGUgPGNhc3NlcnQ+CgpzdHJ1Y3QgQSB7CiAgICB2aXJ0dWFsIH5BKCkgbm9leGNlcHQgPSBkZWZhdWx0Owp9OwoKc3RydWN0IEIgOiB2aXJ0dWFsIHB1YmxpYyBBIHsKICAgIHZpcnR1YWwgfkIoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7Cn07CgpzdHJ1Y3QgQzEgOiBwdWJsaWMgQiB7CiAgICB2aXJ0dWFsIH5DMSgpIG5vZXhjZXB0ID0gZGVmYXVsdDsKfTsKCnN0cnVjdCBDMiA6IHB1YmxpYyBCIHsKICAgIHZpcnR1YWwgfkMyKCkgbm9leGNlcHQgPSBkZWZhdWx0Owp9OwoKc3RydWN0IEQgOiBwdWJsaWMgQzEsIHB1YmxpYyBDMiB7CiAgICB2aXJ0dWFsIH5EKCkgbm9leGNlcHQgPSBkZWZhdWx0Owp9OwoKaW50IG1haW4oKSB7CiAgICBBICpwdHIgPSBuZXcgRDsKICAgIGFzc2VydChkeW5hbWljX2Nhc3Q8RCo+KHB0cikgIT0gbnVsbHB0cik7ICAvLyBvawogICAgYXNzZXJ0KGR5bmFtaWNfY2FzdDxCKj4ocHRyKSA9PSBudWxscHRyKTsgIC8vIGFtYmlnaW91cyBzdWItY2xhc3MgQgp9Cg==