Ugrás a tartalomhoz

C++ virtual function

A Wikiszótárból, a nyitott szótárból


Főnév

C++ virtual function (tsz. C++ virtual functions)

  1. (informatika)

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:

  1. Dinamikus kötés: A virtual kulcsszó 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.
  2. Felülírás (override) ajánlott használata: A override kulcsszóval biztosíthatjuk, hogy a függvényt valóban egy létező virtuális függvény írja felül.
  3. 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 virtual kulcsszó 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 override kulcsszó 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.