#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
}
