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,
- Čo je to Virtuálna funkcia?
- Pravidlá pre virtuálne funkcie v C ++
- Čo je to väzba?
- Skoré viazanie
- Neskoré viazanie
- Čistá virtuálna funkcia
- Abstraktná trieda
- Príklad pre virtuálnu funkciu
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
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) { coutfunction_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.