Tak, to było do ciebie :) i pomimo, że ty nie podałeś merytorycznego uzasadnienia dlaczego dynamic_cast według ciebie świadczy "prawie zawsze o błędzie projektowym" ja postaram się wytłumaczyć jak to wygląda z mojej perspektywy.
Podejście, które zaproponowałeś jest złe w ogólności. Nie widać tego niestety w tak prostym kodzie jednak prowadzi ono przy bardziej złożonych hierarchiach do naruszenia zasady pojedynczej odpowiedzialności. Klasa bazowa zaczyna być wypełniana przez wiele niezwiązanych z nią metod. Interejs, który udostępnia przestaje być spójny z pierwotnymi założeniami i bytem, który modelowała. Ponadto zaczyna ona posiadać wiedzę na temat swoich klas pochodnych (co już twój przykład pokazuje) co stanowi poważne naruszenie dobrych praktyk projektowych.
W twoim przypadku dodajesz do interfejsu metodę ustawiającą promień, ale co to znaczy dla prostokątów, trójkątów itd. ? Ponadto już na poziomie klasy bazowej zakładasz, że klasy pochodne będą posiadały promień - "niektóre" jak się później okazuje. Czyli uzależniasz interfejs wszystkich figur od jakiegoś podzbioru klas bazowych. Jak będziesz chciał dodać informację o wysokości, ilości równoległych boków, przękątnych itd. to za każdym razem będziesz rozszerzał klase bazową?
To jest próba obejścia błędu projektowego popełniając jeszcze większy błąd, który będzie się mścił wraz z rozrostem hierarchii.
Inna kwestią jest fakt, że problem, który został tutaj poruszony z założenia nie powinien wystąpić ponieważ jeśli autor chce wykonać operacje specyficzną dla okręgu to nie powinien do tego używać kontenera wszystkich figur, a co najwyżej kontenera samych okręgów i figur z nich się wywodzących.
Jeśli trzymasz kontener homogeniczny jakiś obiektów to naturalne jest wykonywanie operacji udostępnionych przez interfejs tychże obiektów.
Podejście, które ja zaproponowałem też "paskudzi" interfejs, ale jest to w zasadzie jedna metoda i ich ilość nie powinna się już więcej zmienić. Tutaj kolejne klasy pochodne są obsłużone przez tą klase wizytora (co też w zasadzie powoduje, że interfejs wizytora puchnie ale umówmy się - jest to zgodne z jej przeznaczeniem).
Gdyby twoje rozwiązanie było dobre to w bibliotekach takich jak Qt częsciej spotykałbyś rozepchane interfejsy do granic absurdu niż używał dynamic_casta.
Teraz czekam na merytoryczną odpowiedź dlaczego dynamic_cast świadczy prawie zawsze o błędzie projektowym :) Nie mówię, że tak nie jest tylko chce wiedzieć, że rozmawiam z kimś kto myśli samodzielnie i ma własne przemyślenia na ten temat, a nie powtarza ślepo bez zrozumienia co mówią inni.