struct Parent { virtual ~Parent() = default; }; struct Child : private virtual Parent { }; int main() { Child c0; Parent& p0 = static_cast(c0); // FAILS, Parent is inaccessible Parent& p1 = (Parent&)(c0); // OK ( [expr.cast]/p4.6 ), chooses static_cast Child& c1 = (Child&)(p1) // FAILS, chooses static_cast, but that fails // because Parent is a virtual base ( [expr.static.cast]/p2 ) // (NOT because it is inaccessible) Child& c2 = dynamic_cast(p1); // FAILS, dynamic_cast can be used with a virtual base, // but Parent is still private and so the downcast // is not allowed. // Also, cast notation doesn't consider dynamic_cast }