Cum se implementează funcția virtuală în C ++?



Acest articol vă va prezenta încă un alt concept de programare, care este funcția virtuală în C ++. Conceptul va fi susținut prin demonstrație.

O funcție virtuală în C ++ este o funcție membru în cadrul clasei de bază pe care o redefinim într-o clasă derivată. Acest articol vă va ajuta să explorați conceptul în detaliu. Următoarele indicatoare vor fi tratate în acest articol,

Deci, haideți să începem cu acest articol despre Funcția virtuală în C ++





cum se utilizează bancul de lucru mysql

Ce este funcția virtuală?

O funcție virtuală este o funcție membru în cadrul clasei de bază pe care o redefinim într-o clasă derivată. Este declarat folosind cuvântul cheie virtual. Când este moștenită o clasă care conține funcție virtuală, clasa derivată redefinește funcția virtuală pentru a se potrivi propriilor sale nevoi.

Continuăm cu acest articol despre Funcția virtuală în C ++



Reguli pentru funcția virtuală în C ++:

  • Ele sunt întotdeauna definite într-o clasă de bază și suprascrise în clasa derivată, dar nu este obligatoriu să se suprascrie în clasa derivată.
  • Funcțiile virtuale trebuie declarate în secțiunea publică a clasei.
  • Ele nu pot fi statice sau funcția de prieten, de asemenea, nu poate fi funcția virtuală a altei clase.
  • Funcțiile virtuale ar trebui să fie accesate folosind un pointer pentru a realiza polimorfismul în timpul rulării.

Continuăm cu acest articol despre Funcția virtuală în C ++.

Ce este obligatoriu?

Legarea funcțiilor înseamnă că oriunde există un apel de funcție, compilatorul trebuie să știe cu ce definiție a funcției ar trebui să fie potrivită. Acest lucru depinde de semnătura fiecărei declarații de funcție și de atribuțiile care sunt luate. De asemenea, compilatorul trebuie să știe că atunci când se va întâmpla această potrivire între apelul de funcție și alegerea definiției corecte.

Continuăm cu acest articol despre Funcția virtuală în C ++



Legarea timpurie

Legarea timpurie este un fenomen în care decizia de a se potrivi diferitelor apeluri de funcții are loc în momentul compilării în sine și compilatorul asociază direct legătura cu adresele. Este, de asemenea, cunoscut sub numele de legare statică sau legare în timp de compilare.

  • După cum știm, scriem cod în limbajul de nivel înalt
  • Apoi, compilatorul convertește acest lucru într-un limbaj de nivel scăzut pe care computerul îl poate înțelege, în principal limbajul mașinii în momentul compilării
  • În legarea timpurie, compilatorul furnizează direct adresa instrucțiunii de declarație a funcției către instrucțiunea de apel funcțional
  • Astfel, după cum sugerează și numele, legarea are loc foarte devreme înainte de a rula programul.

Exemplu

#include folosirea spațiului de nume clasa std Animals {public: void sound () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <sound () // returnare timpurie a legării 0}

Ieșire

Ieșire - Funcție virtuală în C ++ - Edureka

lămuriri ion
În acest exemplu, am creat un pointer a către clasa părinte Animale. Apoi, scriind a = & c, indicatorul „a” a început să se refere la obiectul c al clasei Pisici.
a -> sunet () - La apelarea funcției sunet () care este prezentă în ambele clase de către indicatorul „a”, funcția clasei părinte a fost apelată, chiar dacă indicatorul se referă la obiectul clasei Pisici .

Acest lucru se datorează legării timpurii. Știm că „a” este un indicator al clasei părinte care se referă la obiectul clasei copil. Deoarece legarea timpurie are loc în timpul compilării, prin urmare, atunci când compilatorul a văzut că „a” este un pointer al clasei părinte, acesta a asortat apelul cu funcția „sunet ()” a clasei părinte fără a căuta obiectul pointerul se referă la.

Continuăm cu acest articol despre Funcția virtuală în C ++

Legare târzie

În legarea târzie, compilatorul identifică obiectul în timpul rulării și apoi se potrivește apelului funcției cu funcția corectă. Este, de asemenea, cunoscut sub numele de Dynamic Binding sau Runtime Binding.

Legarea târzie a problemei de mai sus poate fi rezolvată utilizând cuvânt cheie virtual în clasa de bază. Să vedem cum se întâmplă acest lucru folosind exemplul de mai sus, însă adăugând doar cuvinte cheie virtuale.

Exemplu

#include folosirea spațiului de nume clasa std Animals {public: virtual void sound () {cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <sound () return 0}

Ieșire

Explicaţie
Aici funcția sound () a clasei de bază este făcută virtuală, astfel compilatorul efectuează acum legarea târzie pentru această funcție. Acum, apelul funcției funcției sound () va fi asortat cu definiția funcției în timp de execuție. Întrucât compilatorul identifică acum pointerul „a” ca referindu-se la obiectul „c” din clasa derivată Cats, va apela funcția sound () a clasei Cats.

Continuăm cu acest articol despre Funcția virtuală în C ++

Funcție virtuală pură

O funcție virtuală pură în C ++ este o funcție virtuală pentru care nu avem o implementare, doar o declarăm. O funcție virtuală pură este declarată prin atribuirea 0 în declarație.

sunet virtual gol () = 0

Aici sunetul () este o creație virtuală pură.

Continuăm cu acest articol despre Funcția virtuală în C ++

Clasa abstractă

O clasă abstractă este definită ca o clasă cu una sau mai multe funcții virtuale pure. După cum s-a explicat mai sus, funcția virtuală pură este o funcție de membru virtual care este marcată ca neavând nicio implementare. Nu are nicio implementare posibilă cu informațiile furnizate în clasă, inclusiv orice clase de bază. O clasă abstractă este, de asemenea, cunoscută sub numele de clasă abstractă de bază.

Exemplu

cum se folosește un iterator în java
#include using namespace std class Employee // abstract base class {virtual int getSalary () = 0 // pure virtual function} class Employee_1: public Employee {int salariu public: Employee_1 (int s) {salariu = s} int getSalary () {retur salariu}} clasa Angajat_2: public Angajat {int salariu public: Angajat_2 (int t) {salariu = t} int getSalary () {return salariu}} int main () {Angajat_1 e1 (5000) Angajat_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 } 

Ieșire

Explicaţie
Funcția ‘getSalary ()’ din clasa Employee este o funcție virtuală pură. Deoarece clasa Angajați conține funcția virtuală pură, prin urmare este o clasă de bază abstractă.
Deoarece funcția virtuală pură este definită în subclasele, prin urmare funcția ‘getSalary ()’ este definită atât în ​​subclasele clasei Employee, adică în Employee_1, cât și în Employee_2.

Continuăm cu acest articol despre Funcția virtuală în C ++

Exemplu pentru funcția virtuală

#includeți utilizarea spațiului de nume 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() }

Ieșire

Explicaţie
Pentru apelul de funcție funcție_1 (), se numește versiunea de clasă de bază a funcției, funcția_2 () este suprascrisă în clasa derivată, deci se numește versiunea de clasă derivată, funcția_3 () nu este suprascrisă în clasa derivată și este funcție virtuală, deci se numește versiunea clasei de bază, în mod similar function_4 () nu este suprascris, așa că se numește versiunea clasei de bază.

Astfel am ajuns la sfârșitul acestui articol despre „Funcția virtuală în C ++”. Dacă doriți să aflați mai multe, consultați de Edureka, o companie de învățare online de încredere. Cursul de formare și certificare Java J2EE și SOA Edureka este conceput pentru a vă instrui atât pentru conceptele Java de bază, cât și pentru cele avansate Java, împreună cu diverse cadre Java, cum ar fi Hibernate & Spring.

Ai o întrebare pentru noi? Vă rugăm să o menționați în secțiunea de comentarii a acestui blog și vă vom contacta cât mai curând posibil.