logo

C++ virtuális függvény

  • 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 &lt;&lt; &apos;Value of x is : &apos; &lt;&lt; x&lt;<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 &lt;&lt; &apos;Base class is invoked&apos;&lt;<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 &lt;&lt; &apos;Derived class is derived from the base class.&apos; <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.