It converts only from non-virtual base class subobject:
struct B
{
virtual ~B() {};
};
struct D : public virtual B { };
int main()
{
D d;
B& br1 = d;
// cannot convert a 'B*' to a 'D*'; conversion from a virtual base class is implied
// static_cast<D&>(br1);
dynamic_cast<D&>(br1);
return 0;
}