C++/Funkcje wirtualne: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
Nie podano opisu zmian |
|||
Linia 8:
Mając klasę bazową wyprowadzamy od niej klasę pochodną:
<pre class="lang-cpp">
class Baza
{
};
class Baza2 : public Baza
{
};
</pre>
Jeżeli teraz w funkcji main stworzymy wskaźnik do obiektu typu Baza, to możemy ten wskaźnik ustawiać na dowolne obiekty tego typu.
Można też ustawić go na obiekt typu pochodnego, czyli Baza2:
<pre class="lang-cpp">
main()▼
{
Baza2 objB2;▼
Baza
Baza
//Teraz ustawiamy wskaźnik wsk na obiekt typu pochodnego▼
wsk = &objB2;▼
wsk =
wsk ->
wsk -> pisz();
}
</pre>
Po skompilowaniu na ekranie zobaczymy dwa wypisy: "Tu funkcja pisz z klasy Baza".
Stało się tak dlatego, że wskaźnik jest do typu Baza. Gdy ustawiliśmy wskaźnik na objekt typu pochodnego (wolno nam), a nastepnie wywołaliśmy funkcję składową, to kompilator "na ślepo" sięgnął po funkcję pisz z klasy bazowej (bo wskaźnik wskazuje na klasę bazową).
Linia 43 ⟶ 55:
Można jednak określić żeby kompilator nie sięgał po funkcję z klasy bazowej, ale sam się zorientował na co wskaźnik pokazuje. Do tego służy przydomek ''virtual'', a funkcja składowa nim oznaczona nazywa się wirtualną.
Różnica polega tylko na dodaniu słowa kluczowego ''virtual'', co wygląda tak:
<pre class="lang-cpp">
'''class''' Baza▼
{▼
{
'''virtual''' '''void''' pisz()▼
public:
cout<<"Tu funkcja pisz z klasy baza";▼
};▼
'''class''' Baza2 : public Baza▼
};
'''virtual''' '''void''' pisz()▼
{
public:
cout<<"Tu funkcja pisz z klasy Baza2";▼
};
</pre>
== Konsekwencje ==
|