Yes, as per §5.2.7 [expr.dynamic.cast], for dynamic_cast<T>(v)
(emphasis mine):
If C is the class type to which T points or refers, the run-time check logically executes as follows:
— If, in the most derived object pointed (referred) to by v, v points (refers) to a public base class
subobject of a C object, and if only one object of type C is derived from the subobject pointed (referred) to by v the result points (refers) to that C object.
— Otherwise, if v points (refers) to a public base class subobject of the most derived object, and the
type of the most derived object has a base class, of type C, that is unambiguous and public, the result points (refers) to the C subobject of the most derived object.
— Otherwise, the run-time check fails.
In your case, v
refers to a most derived object that is an instance of your C
, but the static type of v
is a pointer to the public base class A
. The C
base class mentioned in the quotation is your B
.