Hogyan valósítsuk meg a virtuális funkciót a C ++ nyelven?



Ez a cikk egy újabb programozási koncepciót ismertet meg, amely a C ++ virtuális funkciója. A koncepciót demonstrációval támogatják.

Virtuális függvény a C ++ olyan tagfüggvény az alaposztályon belül, amelyet újból definiálunk egy származtatott osztályban. Ez a cikk segít a koncepció részletes feltárásában. A következő mutatókkal foglalkozunk ebben a cikkben,

Kezdjük tehát a C ++ virtuális funkcióról szóló cikkével





Mi a virtuális funkció?

A virtuális függvény az alaposztályon belüli tagfüggvény, amelyet egy származtatott osztályban definiálunk újra. A virtuális kulcsszó segítségével deklarálható. Amikor egy virtuális függvényt tartalmazó osztály öröklődik, a levezetett osztály újradefiniálja a virtuális függvényt, hogy megfeleljen a saját igényeinek.

Folytatás ezzel a cikkel a virtuális funkcióról a C ++ nyelven



A virtuális funkció szabályai a C ++ nyelven:

  • Ezeket mindig egy alaposztályban definiálják, és a származtatott osztályban felülírják, de a származtatott osztályban nem kötelező felülírni.
  • A virtuális függvényeket az osztály nyilvános szakaszában kell deklarálni.
  • Nem lehetnek statikusak vagy barát funkciók, és nem lehetnek egy másik osztály virtuális funkciói sem.
  • A virtuális funkciókat mutató segítségével kell elérni a futási idő polimorfizmusának elérése érdekében.

Folytatás ezzel a cikkel a virtuális funkcióról a C ++ nyelven.

Mi a kötelező?

A függvények lekötése azt jelenti, hogy bárhol is legyen függvényhívás, a fordítónak tudnia kell, hogy melyik függvénydefinícióhoz kell illeszteni. Ez az egyes függvénydeklarációk aláírásától és a végrehajtott hozzárendelésektől függ. A fordítónak tudnia kell azt is, hogy amikor a függvényhívás és a helyes definíció kiválasztása megtörténik.

Folytatás ezzel a cikkel a virtuális funkcióról a C ++ nyelven



hogyan lehet hatalmat csinálni java-ban

Korai kötés

A korai kötés olyan jelenség, amikor a különféle függvényhívások összehangolására vonatkozó döntés maga a fordítási időpontban történik, és a fordító közvetlenül társítja a kapcsolatot a címekhez. Statikus kötésnek vagy fordítási idejű kötésnek is nevezik.

  • Mint tudjuk, magas szintű nyelven írunk kódot
  • Ezután a fordító ezt alacsony szintű nyelvvé alakítja, amelyet a számítógép megérthet, főleg gépi nyelvvé a fordítás idején
  • Korai kötésben a fordító közvetlenül megadja a függvény deklarációs utasítás címét a függvényhívás utasításának
  • Így, ahogy a neve is mutatja, a kötés nagyon korán, a program futtatása előtt megtörténik.

Példa

#include névtér használatával std osztály Állatok {public: void sound () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <hang () // korai kötés visszatér 0}

Kimenet

Kimenet - Virtuális funkció C ++ nyelven - Edureka

pontosítások ion
Ebben a példában hoztunk létre egy a mutatót az Állatok szülő osztályhoz. Ezután az a = & c írásával az „a” mutató elkezdte utalni a Macskák osztály c objektumára.
a -> hang () - A hang () függvény meghívására, amely mindkét osztályban megtalálható az 'a' mutatóval, a szülő osztály funkciója meghívásra került, még akkor is, ha a mutató a Macskák osztály objektumára vonatkozik .

Ennek oka a korai kötés. Tudjuk, hogy az „a” a szülő osztály mutatója, amely a gyermek osztály objektumára utal. Mivel a korai kötés fordítási időben történik, ezért amikor a fordító látta, hogy az 'a' a szülő osztály mutatója, a hívást a szülő osztály 'sound ()' funkciójával illesztette, anélkül, hogy az objektumra keresett volna arra utal.

Folytatás ezzel a cikkel a virtuális funkcióról a C ++ nyelven

Késői kötés

Késői kötésben a fordító futás közben azonosítja az objektumot, majd a függvényhívást a megfelelő függvénnyel illeszti. Dinamikus kötés vagy futásidejű kötés néven is ismert.

A fenti probléma késői kötése megoldható virtuális kulcsszó használatával az alaposztályban. Lássuk, hogyan történik ez a fenti példa felhasználásával, de csak virtuális kulcsszó hozzáadásával.

Példa

#include névtér használatával std osztály Állatok {public: virtual void sound () {cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <hang () visszatér 0}

Kimenet

Magyarázat
Itt az alaposztály függvényhangja () virtuálissá válik, így a fordító késői kötést hajt végre ehhez a függvényhez. Most a sound () függvény függvényhívása futás közben hozzá lesz rendelve a függvény definíciójához. Mivel a fordító most az „a” mutatót úgy azonosítja, hogy az a „C” származtatott osztály „c” objektumára utal, a Cats osztály hang () függvényét fogja hívni.

Folytatás ezzel a cikkel a virtuális funkcióról a C ++ nyelven

Tiszta virtuális funkció

A C ++ tiszta virtuális függvénye egy virtuális függvény, amelyre nincs megvalósításunk, csak deklaráljuk. A tiszta virtuális függvényt úgy deklaráljuk, hogy a deklarációban 0-t rendelünk hozzá.

virtuális üresség () = 0

Itt a hang () egy tiszta virtuális fukció.

Folytatás ezzel a cikkel a virtuális funkcióról a C ++ nyelven

Absztrakt osztály

Az absztrakt osztály egy vagy több tiszta virtuális funkcióval rendelkező osztály. Amint azt a fentiekben kifejtettük, a tiszta virtuális függvény egy virtuális tagfüggvény, amelyet nincs megvalósításként megjelölve. Nincs megvalósítási lehetőség az osztályban megadott információkkal együtt, beleértve az esetleges alaposztályokat is. Az absztrakt osztály absztrakt alaposztályként is ismert.

Példa

#include névtér használatával std osztály Employee // absztrakt alaposztály {virtual int getSalary () = 0 // tiszta virtuális függvény} class Employee_1: public Employee {int fizetés public: Employee_1 (int s) {fizetés = s} int getSalary () {visszatérő fizetés}} osztály Employee_2: állami alkalmazott {int fizetés public: Employee_2 (int t) {fizetés = t} int getSalary () {return pay}} int main () {Employee_1 e1 (5000) Employee_2 e2 (3000) int a, ba = e1.getSalary () b = e2.getSalary () cout<< 'Salary of Developer : ' << a << endl cout << 'Salary of Driver : ' << b << endl return 0 } 

Kimenet

Magyarázat
Az Employee osztály ’getSalary ()’ függvénye tiszta virtuális függvény. Mivel az Employee osztály tartalmazza a tiszta virtuális függvényt, ezért absztrakt alaposztályról van szó.
Mivel a tiszta virtuális függvény az alosztályokban van definiálva, ezért a ‘getSalary ()’ függvény az Employee osztály alosztályaiban, azaz az Employee_1 és az Employee_2 alatt egyaránt meg van határozva.

Folytatás ezzel a cikkel a virtuális funkcióról a C ++ nyelven

Példa a virtuális funkcióra

#include névtér használatával std class base {public: void function_1 () {cout<< 'base class function 1n' } virtual void function_2() { cout << 'base class function 2n' } virtual void function_3() { cout << 'base class function 3n' } virtual void function_4() { cout << 'base class function 4n' } } class derived : public base { public: void function_1() { cout << 'derived class function 1n' } void function_2() { cout << 'derived class function 2n' } void function_4(int x) { cout function_2 () ptr-> function_3 () ptr-> function_4 ()}

Kimenet

Magyarázat
A function_1 () függvényhíváshoz a függvény alaposztály verzióját hívják meg, a function_2 () karaktert felülírják a származtatott osztályban, így hívják le a származtatott osztály verziót, a function_3 () karaktert nem írják felül a származtatott osztályban, és virtuális függvény, így az alaposztály verzióját hasonlóan a function_4 () sem kerül felülírásra, ezért az alaposztály verzióját hívjuk meg.

Így a „Virtuális funkció a C ++ -ban” c. Cikkünk végéhez értünk. Ha többet szeretne megtudni, nézze meg a Edureka, egy megbízható online tanulási társaság. Az Edureka Java J2EE és SOA képzési és tanúsítási tanfolyamát arra tervezték, hogy mind az alapvető, mind a fejlett Java koncepciókra kiképezzen különféle Java keretrendszereket, például a Hibernate & Spring.

Van egy kérdésünk? Kérjük, említse meg a blog megjegyzés rovatában, és a lehető leghamarabb kapcsolatba lépünk Önnel.