C++ virtual function
Megjelenés
| polymorphism |
|---|
| ad hoc polymorphism |
| parametric polymorphism |
| subtyping |
Főnév
C++ virtual function (tsz. C++ virtual functions)
A virtuális függvény (virtual function) a C++-ban egy olyan tagfüggvény egy osztályban, amelyet az alosztályok felülírhatnak (override-olhatnak), és amelyet dinamikus kötés (runtime polymorphism) segítségével hívhatunk meg.
Virtuális függvények jelentősége
Normál esetben, ha egy származtatott osztály egy ősosztályból örökli a függvényeket, és az ősosztály típusán keresztül hívjuk meg őket, akkor az ősosztály implementációja fut le. Ha azonban a függvényt virtual kulcsszóval jelöljük, akkor a program a tényleges objektum típusának megfelelő függvényhívást fogja végrehajtani.
Alapvető példa virtuális függvényre
#include <iostream>
using namespace std;
class Alaposztaly {
public:
virtual void kiir() { // Virtuális függvény
cout << "Alaposztály kiir függvénye" << endl;
}
};
class Szarmaztatott : public Alaposztaly {
public:
void kiir() override { // Felülírjuk az ősosztály virtuális függvényét
cout << "Származtatott osztály kiir függvénye" << endl;
}
};
int main() {
Alaposztaly* ptr; // Ősosztály mutatója
Szarmaztatott obj;
ptr = &obj;
ptr->kiir(); // Dinamikus kötés miatt a származtatott osztály függvénye hívódik meg
return 0;
}
Kimenet:
Származtatott osztály kiir függvénye
Fontos tudnivalók:
- Dinamikus kötés: A
virtualkulcsszó miatt a fordító nem az ősosztály verzióját hívja meg, hanem az objektum tényleges típusához tartozó verziót. - Felülírás (
override) ajánlott használata: Aoverridekulcsszóval biztosíthatjuk, hogy a függvényt valóban egy létező virtuális függvény írja felül. - Virtuális destruktor: Ha egy osztályt virtuális függvényekkel használunk, célszerű a destruktort is virtuálissá tenni, hogy az öröklött objektumok megfelelően törlődjenek.
Virtuális destruktor példája
class Alaposztaly {
public:
virtual ~Alaposztaly() { // Virtuális destruktor
cout << "Alaposztály destruktora" << endl;
}
};
class Szarmaztatott : public Alaposztaly {
public:
~Szarmaztatott() {
cout << "Származtatott osztály destruktora" << endl;
}
};
int main() {
Alaposztaly* ptr = new Szarmaztatott();
delete ptr; // Mindkét destruktor lefut
return 0;
}
Kimenet:
Származtatott osztály destruktora Alaposztály destruktora
Ha a destruktor nem lenne virtuális, akkor csak az ősosztály destruktora futna le, ami memóriaszivárgást okozhatna.
Összegzés
- A
virtualkulcsszó lehetővé teszi, hogy a függvények dinamikus kötést kapjanak. - A dinamikus kötés biztosítja, hogy a megfelelő függvényhívás történjen az objektum tényleges típusa alapján.
- Az
overridekulcsszó segít az egyértelműbb kódírásban. - A virtuális destruktorok megakadályozzák a memóriaszivárgást öröklött osztályoknál.
- C++ virtual function - Szótár.net (en-hu)
- C++ virtual function - Sztaki (en-hu)
- C++ virtual function - Merriam–Webster
- C++ virtual function - Cambridge
- C++ virtual function - WordNet
- C++ virtual function - Яндекс (en-ru)
- C++ virtual function - Google (en-hu)
- C++ virtual function - Wikidata
- C++ virtual function - Wikipédia (angol)