- A C++ virtuális függvény egy tagfüggvény az alaposztályban, amelyet újradefiniál egy származtatott osztályban. A virtuális kulcsszó használatával deklarálják.
- Arra használjuk, hogy a fordítónak utasítsuk, hogy dinamikus csatolást vagy késői kötést hajtson végre a függvényen.
- Szükséges az egyetlen mutató használata a különböző osztályok összes objektumára való hivatkozáshoz. Tehát létrehozzuk a mutatót az alaposztályra, amely az összes származtatott objektumra hivatkozik. De ha az alaposztálymutató tartalmazza a származtatott osztályobjektum címét, mindig végrehajtja az alaposztályfüggvényt. Ez a probléma csak a „virtuális” funkció használatával oldható meg.
- A „virtuális” egy kulcsszó, amely megelőzi egy függvény normál deklarációját.
- Amikor a függvény virtuálissá válik, a C++ meghatározza, hogy melyik függvényt kell meghívni a futási időben az alaposztálymutató által mutatott objektum típusa alapján.
Késői kötés vagy dinamikus kapcsolódás
Késői kötésben a függvényhívás futás közben megoldódik. Ezért a fordító futás közben meghatározza az objektum típusát, majd leköti a függvényhívást.
A virtuális funkció szabályai
scan.nextstring java
- A virtuális függvényeknek valamilyen osztály tagjainak kell lenniük.
- A virtuális függvények nem lehetnek statikus tagok.
- Objektummutatókon keresztül érhetők el.
- Egy másik osztály barátja lehet.
- Egy virtuális függvényt meg kell határozni az alaposztályban, még akkor is, ha nem használják.
- Az alaposztály virtuális függvényének prototípusának és az összes származtatott osztálynak azonosnak kell lennie. Ha a két függvény azonos nevű, de eltérő prototípussal rendelkezik, a C++ túlterhelt függvénynek tekinti őket.
- Nem lehet virtuális konstruktorunk, de virtuális destruktorunk igen
- Tekintsük azt a helyzetet, amikor nem használjuk a virtuális kulcsszót.
#include using namespace std; class A { int x=5; public: void display() { std::cout << 'Value of x is : ' << x<<std::endl; } }; class b: public a { int y="10;" public: void display() std::cout << 'value of is : ' <<y<<std::endl; main() *a; b b; a->display(); return 0; } </std::endl;>
Kimenet:
Value of x is : 5
A fenti példában * a az alaposztály mutatója. A mutató csak az alaposztály tagjaihoz férhet hozzá, a származtatott osztály tagjaihoz nem. Bár a C++ lehetővé teszi, hogy az alapmutató bármely, az alaposztályból származó objektumra mutasson, nem férhet hozzá közvetlenül a származtatott osztály tagjaihoz. Ezért szükség van egy virtuális függvényre, amely lehetővé teszi, hogy az alapmutató hozzáférjen a származtatott osztály tagjaihoz.
C++ virtuális függvény Példa
Nézzük a C++ virtuális függvény egyszerű példáját, amellyel a programban a származtatott osztályt hívják meg.
#include { public: virtual void display() { cout << 'Base class is invoked'<<endl; } }; class b:public a { public: void display() cout << 'derived is invoked'<<endl; int main() a* a; pointer of base b b; object derived a->display(); //Late Binding occurs } </endl;>
Kimenet:
Derived Class is invoked
Pure Virtual Function
- A virtuális funkció nem használható semmilyen feladat végrehajtására. Csak helyőrzőként szolgál.
- Ha a függvénynek nincs definíciója, akkor ezt a függvényt ' ne csinálj semmit ' funkciót.
- A ' ne csinálj semmit ' függvény a tiszta virtuális funkció . A tiszta virtuális függvény az alaposztályban deklarált függvény, amelynek nincs definíciója az alaposztályhoz képest.
- A tisztán virtuális függvényt tartalmazó osztály nem használható saját objektumok deklarálására, az ilyen osztályokat absztrakt alaposztályoknak nevezzük.
- Az alaposztály fő célja, hogy a származtatott osztályokhoz a tulajdonságokat biztosítsa, és létrehozza a futásidejű polimorfizmus eléréséhez használt alapmutatót.
A tiszta virtuális függvény a következőképpen definiálható:
virtual void display() = 0;
Lássunk egy egyszerű példát:
konvertálja a karakterláncot int-vé
#include using namespace std; class Base { public: virtual void show() = 0; }; class Derived : public Base { public: void show() { std::cout << 'Derived class is derived from the base class.' <show(); return 0; } < pre> <p> <strong>Output:</strong> </p> <pre> Derived class is derived from the base class. </pre> <p>In the above example, the base class contains the pure virtual function. Therefore, the base class is an abstract base class. We cannot create the object of the base class.</p></show();>
A fenti példában az alaposztály tartalmazza a tisztán virtuális függvényt. Ezért az alaposztály egy absztrakt alaposztály. Az alaposztály objektumát nem tudjuk létrehozni.