Hej
Dlaczego uważa się, że polimorfizm dynamiczny jest kosztowny w przeciwieństwie do statycznego, bo wydaje mi się, że powód numer 2 to tylko w jakichśtam granicznych i rzadkich przypadkach a pierwszy to można olać, nie jest aż tak kosztowny?
1.) wywołanie metody wirtualnej powoduje, że trzeba jeszcze odwołać się do vtable i to tyle czasu aż zabiera, ze 2-3 instrukcje procesora więcej?
2.) bo trzeba dynamicznie rzutować jak ktoś nie jest pewny rzutowania, np.
class Base
{
public:
virtual ~Base() = default;
//jakieś metody wirtualne
};
class Derived: public Base
{
void fun(){} //dodatkowa metoda ktorej nie ma w Base
}
ktoś ma wskaźnik do klasy bazowej pod którym rpzechowuje obiekt Derived a chce wywołać metodę fun, no to musi rzutować i jak nie jest pewny w swoim programie czy to jest właściwe to musi rzutować przez dynamic_cast zamiast static_cast i to jest kosztowne plus if na dynamiczne sprawdzenie typu czy nie jest NULLem.
Jeszcze na korzyść używania polimorfizmu statycznego znalazłem argument, że w czasie kompilacji jest sprawdzanie typów a przy polimorfiźmie dynamicznym w czasie kompilacji. Ale to też ktoś na wyrost napisał, bo to tylko tyczy się powyższego przypadku numer 2, gdy ktoś dynamic_cast używa, mam rację?
Czy są jeszcze jakieś powody?
I jeszcze dobre pytanie czy mamy do czynienia z polimorfizmem dla powyższego przykładu jeżeli od razu podamy typ zmiennej Derived? To wtedy mamy statyczny polimorfizm? A więc do statycznego polimorfizmu nie zaliczają się tylko templejty ale też przypadki "dynamicznego polimorfizmu" w ktorych od razu jest podany typ pochodny?