C++/Funkcje wirtualne: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
typo in class name (bazowa instead of Bazowa)
+dynamic_cast
Linia 167:
Wyżej opisane działanie zostało spowodowane przez określenie metody w klasie bazowej jako '''wirtualnej'''. Gdyby zostało usunięte słowo kluczowe ''virtual'' w deklaracji metody w klasie bazowej, zostałyby wykonane metody zgodne z typem wskaźnika lub referencji, a więc za każdym razem zostałaby wykonana metoda <code>float pole()</code> z klasy <code>Figura</code>.
 
==Rzutowanie dynamiczne - dynamic_cast==
 
Rzutowanie dynamiczne pozwala '''w czasie wykonywania''' konwertować wskaźniki lub referencje klas bazowych do klas pochodnych - jest to tzw. rzutowanie w dół (hierarchii). Rzutowanie to realizuje operator '''dynamic_cast''', jednak dostępny jest jedynie dla klas posiadających metody wirtualne (klasy polimorficzne). Ogólnie C++ pozwala na odczytywanie informacji o zależnościach między klasami polimorficznymi, jest to tzw. RTTI (ang. ''RunTime Type Information''), '''dynamic_cast''' korzysta z tych danych.
 
Jakie jest zastosowanie takiego rzutowania? Wyobraźmy, że posiadamy listę figur z przykładu. Figura jednak udostępnia jedynie swój interfejs, a my np. chcielibyśmy wykonać jakieś działanie wyłącznie na obiektach typu Kwadrat. Dzięki '''dynamic_cast''' możemy sprawdzić, czy figura jest odpowiedniego typu, dokonać konwersji i używać obiektu Kwadrat w żądny sposób.
 
<source lang="cpp">
Figura* figura = new NazwaFigury(...);
 
Kwadrat* kwadrat = dynamic_cast<Kwadrat*>(figura);
if (kwadrat) {
// działania na kwadracie
} else {
std::cout << "figura nie jest kwadratem" << '\n';
}
</source>
 
Wynikiem poprawnego rzutowania wskaźników jest '''niepusty wskaźnik'''. Jeśli rzutowanie jest niemożliwe wskaźnik jest pusty.
 
Z kolei wynikiem rzutowania referencji może być tylko referencja, niemożliwość konwersji sygnalizowana jest wyjątkiem <tt>std::bad_cast</tt>.
 
==Metody i klasy abstrakcyjne==