Ako implementovať virtuálnu funkciu v C ++?



Tento článok vám predstaví ešte jeden koncept programovania, ktorým je Virtual Function v C ++. Koncept bude podporený demonštráciou.

Virtuálna funkcia v systéme Windows C ++ je členská funkcia v základnej triede, ktorú predefinujeme v odvodenej triede. Tento článok vám pomôže podrobne preskúmať tento koncept. Nasledujúcim ukazovateľom sa budeme venovať v tomto článku,

Začnime teda týmto článkom o virtuálnej funkcii v C ++





Čo je to Virtuálna funkcia?

Virtuálna funkcia je členská funkcia v základnej triede, ktorú predefinujeme v odvodenej triede. Deklaruje sa pomocou virtuálneho kľúčového slova. Keď sa dedí trieda obsahujúca virtuálnu funkciu, odvodená trieda predefinuje virtuálnu funkciu tak, aby vyhovovala jej vlastným potrebám.

Pokračujeme týmto článkom o virtuálnej funkcii v C ++



Pravidlá pre virtuálne funkcie v C ++:

  • Vždy sú definované v základnej triede a prepísané v odvodenej triede, ale nie je povinné prepísať v odvodenej triede.
  • Virtuálne funkcie musia byť deklarované vo verejnej časti triedy.
  • Nemôžu byť statické alebo priateľské, rovnako nemôžu byť virtuálnymi funkciami inej triedy.
  • K virtuálnym funkciám by sa malo pristupovať pomocou ukazovateľa, aby sa dosiahol polymorfizmus doby behu.

Pokračujeme týmto článkom o virtuálnej funkcii v C ++.

Čo je záväzné?

Viazanie na funkcie znamená, že kdekoľvek existuje volanie funkcie, kompilátor potrebuje vedieť, ku ktorej definícii funkcie by sa mala priradiť. Závisí to od podpisu každého vyhlásenia funkcie a od priradení, ktoré sa vykonajú. Kompilátor musí tiež vedieť, že keď dôjde k zhode medzi volaním funkcie a výberom správnej definície.

Pokračujeme týmto článkom o virtuálnej funkcii v C ++



Skoré viazanie

Skorá väzba je jav, pri ktorom sa rozhodnutie o zhode s rôznymi volaniami funkcií deje v samotnom čase kompilácie a prekladač priamo spojí odkaz s adresami. Je tiež známa ako statická väzba alebo kompilácia.

  • Ako vieme, kód píšeme v jazyku na vysokej úrovni
  • Potom to prekladač prevedie do jazyka nízkej úrovne, ktorému počítač rozumie, väčšinou do strojového jazyka v čase kompilácie
  • Na začiatku väzby kompilátor priamo poskytne adresu inštrukcie deklarácie funkcie inštrukcii volania funkcie
  • Názov teda naznačuje, že k väzbe dôjde veľmi skoro pred spustením programu.

Príklad

#include using namespace std class Animals {public: void sound () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <sound () // skorý návrat väzby 0}

Výkon

Výstup - Virtuálna funkcia v C ++ - Edureka

objasnenia ión
V tomto príklade sme vytvorili ukazovateľ a na nadradenú triedu Animals. Potom napísaním a = & c začal ukazovateľ „a“ odkazovať na objekt c triedy Cats.
a -> sound () - Pri volaní funkcie sound (), ktorá je v obidvoch triedach ukazovateľom „a“, bola zavolaná funkcia rodičovskej triedy, aj keď ukazovateľ odkazuje na objekt triedy Cats .

Je to spôsobené včasnou väzbou. Vieme, že ‘a’ je ukazovateľ nadradenej triedy odkazujúci na objekt podradenej triedy. Pretože skorá väzba sa deje v čase kompilácie, takže keď kompilátor videl, že „a“ je ukazovateľ nadradenej triedy, priradil hovor k funkcii „sound ()“ nadradenej triedy bez toho, aby hľadal objekt, na ktorý je ukazovateľ odkazuje na.

Pokračujeme týmto článkom o virtuálnej funkcii v C ++

Neskoré viazanie

Pri neskorej väzbe kompilátor identifikuje objekt za behu a potom spojí volanie funkcie so správnou funkciou. Je tiež známa ako dynamická väzba alebo väzba za behu.

Neskoré viazanie vo vyššie uvedenom probléme možno vyriešiť použitím virtuálneho kľúčového slova v základnej triede. Pozrime sa, ako sa to stane, pomocou vyššie uvedeného príkladu, ale iba pridania virtuálneho kľúčového slova.

abstrakcia v c ++

Príklad

#include using namespace std class Animals {public: virtual void sound () {cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <sound () návrat 0}

Výkon

Vysvetlenie
Tu sa funkcia sound () základnej triedy urobí virtuálnou, takže kompilátor teraz vykoná pre túto funkciu neskorú väzbu. Teraz sa volanie funkcie funkcie sound () bude zhodovať s definíciou funkcie za behu programu. Pretože kompilátor teraz identifikuje ukazovateľ „a“ ako odkaz na objekt „c“ odvodenej triedy Cats, bude nazývať funkciu sound () triedy Cats.

Pokračujeme týmto článkom o virtuálnej funkcii v C ++

Čistá virtuálna funkcia

Čistá virtuálna funkcia v C ++ je virtuálna funkcia, pre ktorú nemáme implementáciu, iba ju deklarujeme. Čistá virtuálna funkcia je deklarovaná priradením 0 v deklarácii.

zvuk virtuálnych prázdnin () = 0

Sound () je tu čisto virtuálna funkcia.

Pokračujeme týmto článkom o virtuálnej funkcii v C ++

Abstraktná trieda

Abstraktná trieda je definovaná ako trieda s jednou alebo viacerými čisto virtuálnymi funkciami. Ako je vysvetlené vyššie, čistá virtuálna funkcia je virtuálna členská funkcia, ktorá je označená ako bez implementácie. Nemá implementáciu možnú s informáciami poskytnutými v triede, vrátane akýchkoľvek základných tried. Abstraktná trieda je tiež známa ako abstraktná základná trieda.

Príklad

#include using namespace std class Employee // abstract base class {virtual int getSalary () = 0 // pure virtual function} class Employee_1: public Employee {int plate public: Employee_1 (int s) {plate = s} int getSalary () {return plat}} trieda Employee_2: public Employee {int plate public: Employee_2 (int t) {plate = t} int getSalary () {return plate}} 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 } 

Výkon

Vysvetlenie
Funkcia 'getSalary ()' v triede Employee je čisto virtuálna funkcia. Pretože trieda Employee obsahuje čisto virtuálnu funkciu, ide o abstraktnú základnú triedu.
Pretože čistá virtuálna funkcia je definovaná v podtriedach, je preto funkcia „getSalary ()“ definovaná v oboch podtriedach triedy Employee, tj. V Employee_1 a Employee_2.

Pokračujeme týmto článkom o virtuálnej funkcii v C ++

Príklad pre virtuálnu funkciu

#include using namespace 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 ()}

Výkon

Vysvetlenie
Pre volanie funkcie function_1 () sa volá verzia funkcie základnej triedy, funkcia_2 () je prepísaná v odvodenej triede, takže sa volá verzia odvodenej triedy, funkcia_3 () nie je prepísaná v odvodenej triede a je virtuálnou funkciou, takže sa volá verzia základnej triedy, podobne function_4 () nie je prepísaná, takže sa volá verzia základnej triedy.

Tak sme sa dostali na koniec tohto článku o „Virtuálnej funkcii v C ++“. Ak sa chcete dozvedieť viac, pozrite si Edureka, dôveryhodná online vzdelávacia spoločnosť. Výcvikový a certifikačný kurz Edureka Java J2EE a SOA je navrhnutý tak, aby vás vyškolil na základné aj pokročilé koncepty Java spolu s rôznymi rámcami Java, ako je Hibernate & Spring.

Máte na nás otázku? Uveďte to prosím v sekcii komentárov tohto blogu a my sa vám ozveme čo najskôr.