Błąd to jest w zrozumieniu. Już w piątej linijce masz źle, bo Twoją intencją jest, by PI = 3.14, a zamiast tego masz jakieś tam konwersje, ponieważ poprawnie powinno być:
float PI = 3.14;
a raczej const float, bo jak mniemam PI jest liczbą stałą.
Druga sprawa - źle metody. Virtual leci do klasy rodzica, nie dziecka, stąd można zrobić tak:
virtual void calculate() {};
a następnie poprawić obie metody w pozostałych klasach.
Ponadto, pierwszy błąd (z float) pociąga za sobą inne rzeczy, na przykład źle będzie wyliczane pole oraz obwód. W dodatku warto zauważyć, że od strony matematycznej wzór na pole powinien być inny. W tej formie dostajesz dwukrotność pola.
Ogółem polecam się zapoznać z materiałem pod tym linkiem. Może i nie jest najprostsze, ale to jak cały C++.