во втором примере вы создаете класс B, B является базовым классом для C.
, поэтому вы не можете привести базовый класс к некоторому производному классу.
это будет работать:
B *pb = new C();
C *pc = dynamic_cast<C*>(pb);
относительно третьего примера D получено из B и A, но B также получено из A, это создает проблемы для компилятора.вы пытаетесь получить 2 раза для A, компилятор не будет знать, какую функцию A использовать, базовую A или производную версию B. al
вам следует прочитать больше о базовых и производных классах.