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
{
public:
void pisz()
{
std::cout << "Tu funkcja pisz z klasy baza" << std::endl;
}
};
 
class Baza2 : public Baza
{
public:
void pisz()
{
std::cout << "Tu funkcja pisz z klasy Baza2" << std::endl;
}
};
 
</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()
 
{
void main()
Baza *wsk;
{
Baza objB;
 
Baza2 objB2;
Baza *wsk = &objB;
Baza wsk->pisz()objB;
Baza2 objB2;
//Teraz ustawiamy wskaźnik wsk na obiekt typu pochodnego
 
wsk = &objB2;
wsk = wsk->pisz()&objB;
wsk -> }pisz();
 
// Teraz ustawiamy wskaźnik wsk na obiekt typu pochodnego
 
wsk = &objB2;
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
 
{
'''class''' Baza
'''public''':
{
'''virtual''' '''void''' pisz()
public:
{
'''virtual''' '''void''' pisz()
cout<<"Tu funkcja pisz z klasy baza";
}{
std::cout cout<< "Tu funkcja pisz z klasy baza" << std::endl;
};
{}
'''class''' Baza2 : public Baza
};
{
 
'''public''':
'''class''' Baza2 : public Baza
'''virtual''' '''void''' pisz()
{
{
public:
cout<<"Tu funkcja pisz z klasy Baza2";
'''virtual''' '''void''' pisz()
}
};{
std::cout cout<< "Tu funkcja pisz z klasy Baza2" << std::endl;
};
};
 
</pre>
 
== Konsekwencje ==