Jakie rezultaty pojawią się po uruchomieniu poniższego kodu napisanego w języku C++?
class KlasaBazowa { public: virtual void metoda() { cout << "Bazowa. "; } }; class KlasaPochodna : public KlasaBazowa { public: void metoda() { cout << "Pochodna. "; } }; int main() { KlasaBazowa *bazowa = new KlasaPochodna(); KlasaPochodna *pochodna = new KlasaPochodna(); bazowa->metoda(); pochodna->metoda(); return 0; }
A. Bazowa. Bazowa.
B. Bazowa. Pochodna.
C. Pochodna. Pochodna.
D. Pochodna. Bazowa.
Kod wyświetla 'Pochodna. Pochodna.', co wskazuje, że metody klasy pochodnej przejęły kontrolę nad tymi z klasy bazowej. To fajny przykład polimorfizmu, jaki mamy w C++. Tutaj metoda w klasie pochodnej jest lepsza od metody w klasie bazowej. To, jakie wywołanie się wykona, zależy od konkretnego obiektu, a nie od tego, jaką metodę zdefiniowaliśmy w klasie bazowej.
Wyświetlenie 'Bazowa. Pochodna.' wskazywałoby, że tylko jedna z metod została nadpisana, co nie ma sensu w tym przypadku. Znacznik 'Bazowa. Bazowa.' to już totalny brak polimorfizmu, co zupełnie mija się z celem tego kodu. A 'Pochodna. Bazowa.' sugerowałoby, że mamy do czynienia z częściowym nadpisaniem metod, co też nie jest zgodne z tym, co mamy w kodzie.