- Virtuálna funkcia C++ je členská funkcia v základnej triede, ktorú predefinujete v odvodenej triede. Deklaruje sa pomocou kľúčového slova virtual.
- Používa sa na to, aby povedal kompilátoru, aby vykonal dynamické prepojenie alebo neskoré viazanie funkcie.
- Je potrebné použiť jediný ukazovateľ na odkazovanie na všetky objekty rôznych tried. Takže vytvoríme ukazovateľ na základnú triedu, ktorá odkazuje na všetky odvodené objekty. Ale keď ukazovateľ základnej triedy obsahuje adresu objektu odvodenej triedy, vždy vykoná funkciu základnej triedy. Tento problém je možné vyriešiť iba pomocou „virtuálnej“ funkcie.
- „Virtuálny“ je kľúčové slovo, ktoré predchádza normálnej deklarácii funkcie.
- Keď sa funkcia stane virtuálnou, C++ určí, ktorá funkcia sa má vyvolať za behu na základe typu objektu, na ktorý ukazuje ukazovateľ základnej triedy.
Neskorá väzba alebo dynamické prepojenie
Pri neskorej väzbe je volanie funkcie vyriešené počas behu. Preto kompilátor určí typ objektu za behu a potom naviaže volanie funkcie.
Pravidlá virtuálnej funkcie
konverzia nfa na dfa
- Virtuálne funkcie musia byť členmi nejakej triedy.
- Virtuálne funkcie nemôžu byť statickými členmi.
- Sú prístupné prostredníctvom ukazovateľov objektu.
- Môžu byť kamarátmi z inej triedy.
- Virtuálna funkcia musí byť definovaná v základnej triede, aj keď sa nepoužíva.
- Prototypy virtuálnej funkcie základnej triedy a všetkých odvodených tried musia byť identické. Ak tieto dve funkcie majú rovnaký názov, ale rôzne prototypy, C++ ich bude považovať za preťažené funkcie.
- Nemôžeme mať virtuálny konštruktor, ale môžeme mať virtuálny deštruktor
- Zvážte situáciu, keď nepoužijeme kľúčové slovo virtuálne.
#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;>
Výkon:
Value of x is : 5
Vo vyššie uvedenom príklade je * a ukazovateľ základnej triedy. Ukazovateľ má prístup len k členom základnej triedy, ale nie k členom odvodenej triedy. Hoci C++ umožňuje základnému ukazovateľu ukazovať na akýkoľvek objekt odvodený od základnej triedy, nemôže priamo pristupovať k členom odvodenej triedy. Preto je potrebná virtuálna funkcia, ktorá umožňuje základnému ukazovateľu prístup k členom odvodenej triedy.
Príklad virtuálnej funkcie C++
Pozrime sa na jednoduchý príklad virtuálnej funkcie C++ použitej na vyvolanie odvodenej triedy v programe.
#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;>
Výkon:
Derived Class is invoked
Čistá virtuálna funkcia
- Virtuálna funkcia sa nepoužíva na vykonávanie žiadnej úlohy. Slúži len ako zástupný symbol.
- Ak funkcia nemá žiadnu definíciu, takáto funkcia je známa ako „ nerob nič funkciu.
- ' nerob nič ' funkcia je známa ako a čistá virtuálna funkcia . Čistá virtuálna funkcia je funkcia deklarovaná v základnej triede, ktorá nemá žiadnu definíciu vo vzťahu k základnej triede.
- Trieda obsahujúca čisto virtuálnu funkciu nemôže byť použitá na deklarovanie vlastných objektov, takéto triedy sú známe ako abstraktné základné triedy.
- Hlavným cieľom základnej triedy je poskytnúť vlastnosti odvodeným triedam a vytvoriť základný ukazovateľ používaný na dosiahnutie polymorfizmu za behu.
Čistá virtuálna funkcia môže byť definovaná ako:
virtual void display() = 0;
Pozrime sa na jednoduchý príklad:
cast string to int
#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();>
Vo vyššie uvedenom príklade obsahuje základná trieda čisto virtuálnu funkciu. Preto je základná trieda abstraktnou základnou triedou. Nemôžeme vytvoriť objekt základnej triedy.