Com implementar la funció virtual a C ++?

Aquest article us presentarà un altre concepte de programació que és la funció virtual en C ++. El concepte es recolzarà en demostracions.

Una funció virtual a C ++ és una funció membre dins de la classe base que redefinim en una classe derivada. Aquest article us ajudarà a explorar el concepte amb detall. Els següents indicadors es tractaran en aquest article,



Comencem, doncs, amb aquest article sobre Funció virtual en C ++



s'estableix el camí de la classe a Java

Què és la funció virtual?

Una funció virtual és una funció membre dins de la classe base que redefinim en una classe derivada. Es declara mitjançant la paraula clau virtual. Quan s’hereta una classe que conté una funció virtual, la classe derivada redefineix la funció virtual perquè s’adapti a les seves pròpies necessitats.

Continuem amb aquest article sobre Funció virtual en C ++



Regles per a la funció virtual en C ++:

  • Sempre es defineixen en una classe base i es substitueixen en una classe derivada, però no és obligatori substituir-la a la classe derivada.
  • Les funcions virtuals s'han de declarar a la secció pública de la classe.
  • No poden ser estàtics o la funció amic tampoc no pot ser la funció virtual d'una altra classe.
  • S'hauria d'accedir a les funcions virtuals mitjançant un punter per aconseguir un polimorfisme en temps d'execució.

Continuem amb aquest article sobre Funció virtual en C ++.

Què és obligatori?

La vinculació de funcions significa que, allà on hi hagi una trucada de funció, el compilador ha de saber a quina definició de funció s’ha d’adaptar. Això depèn de la signatura de cada declaració de funció i de les assignacions que es prenguin. A més, el compilador ha de saber que quan es produirà aquesta coincidència entre la funció de trucada i l'elecció de la definició correcta.

Continuem amb aquest article sobre Funció virtual en C ++



Enquadernació primerenca

L'enllaç precoç és un fenomen en què la decisió de fer coincidir diverses trucades de funcions es produeix al mateix temps de compilació i el compilador associa directament l'enllaç amb les adreces. També es coneix com a enquadernació estàtica o enquadernació en temps de compilació.

  • Com sabem, escrivim codi en un llenguatge d'alt nivell
  • Aleshores, el compilador el converteix en un llenguatge de baix nivell que l’ordinador pot entendre, sobretot llenguatge de màquina en el moment de la compilació
  • En el primer enllaç, el compilador proporciona directament la instrucció de declaració de funció a la instrucció de trucada de funció
  • Així, com el seu nom indica, l'enquadernació es produeix molt d'hora abans que s'executi el programa.

Exemple

#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 () // devolució de la vinculació anticipada 0}

Sortida

Sortida: funció virtual en C ++ - Edureka

aclariments
En aquest exemple, hem creat un punter a a la classe pare Animals. Després, escrivint a = & c, el punter ‘a’ va començar a referir-se a l’objecte c de la classe Gats.
a -> sound () - En trucar a la funció sound () que és present a les dues classes mitjançant el punter 'a', es crida la funció de la classe pare, fins i tot si el punter fa referència a l'objecte de la classe Cats .

Això es deu a Early Binding. Sabem que ‘a’ és un indicador de la classe pare que fa referència a l’objecte de la classe infantil. Com que l’enquadernació inicial es produeix en temps de compilació, per tant, quan el compilador va veure que «a» és un punter de la classe pare, va coincidir la trucada amb la funció «sound ()» de la classe pare sense cercar objecte el punter que es refereix a.

Continuem amb aquest article sobre Funció virtual en C ++

Enquadernació tardana

En la vinculació tardana, el compilador identifica l'objecte en temps d'execució i, a continuació, fa coincidir la trucada de funció amb la funció correcta. També es coneix com a enquadernació dinàmica o Runtime Binding.

La vinculació tardana del problema anterior es pot resoldre mitjançant l'ús de paraula clau virtual a la classe base. Vegem com passa això utilitzant l'exemple anterior, però només afegint paraules clau virtuals.

Exemple

#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 () return 0}

Sortida

Explicació
Aquí la funció sound () de la classe base es fa virtual, de manera que ara el compilador realitza un enllaç tardà per a aquesta funció. Ara, la trucada de funció de la funció sound () es farà coincidir amb la definició de funció en temps d'execució. Com que el compilador ara identifica el punter ‘a’ com a referent a l’objecte ‘c’ de la classe derivada Cats, anomenarà la funció sound () de la classe Cats.

Continuem amb aquest article sobre Funció virtual en C ++

Funció virtual pura

Una funció virtual pura a C ++ és una funció virtual per a la qual no tenim cap implementació, només la declarem. Es declara una funció virtual pura assignant 0 a la declaració.

so de buit virtual () = 0

Aquí sound () és una pura fuction virtual.

Continuem amb aquest article sobre Funció virtual en C ++

Classe de Resum

Una classe abstracta es defineix com una classe amb una o més funcions virtuals pures. Com s'ha explicat anteriorment, la funció virtual pura és una funció de membre virtual que es marca com a que no té implementació. No té cap implementació possible amb la informació proporcionada a la classe, incloses les classes base. Una classe abstracta també es coneix com a classe base abstracta.

Exemple

tutorial de desenvolupador de sq sq per a principiants
#include using namespace std class Employee // abstract base class {virtual int getSalary () = 0 // pure virtual function} class Employee_1: public Employee {int salari públic: Employee_1 (int s) {salari = s} int getSalary () {tornar salari}} classe Empleat_2: empleat públic {int salari públic: empleat_2 (int t) {salari = t} int getSalary () {retorn salari}} int principal () {Empleat_1 e1 (5000) Empleat_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 } 

Sortida

Explicació
La funció ‘getSalary ()’ de la classe Employee és una funció virtual pura. Atès que la classe Employee conté la funció virtual pura, per tant, és una classe base abstracta.
Atès que la funció virtual pura es defineix a les subclasses, per tant la funció 'getSalary ()' es defineix tant a les subclasses de la classe Employee, és a dir, com a Employee_1 i Employee_2.

Continuem amb aquest article sobre Funció virtual en C ++

Exemple de funció virtual

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

Sortida

Explicació
Per a la trucada de funció function_1 (), s’anomena la versió de funció de classe base, function_2 () s’anul·la a la classe derivada de manera que s’anomena la versió derivada de la classe, function_3 () no s’anul·la a la classe derivada i és funció virtual per la qual cosa s’anomena la versió de classe base de la mateixa manera function_4 () no s'anul·la, de manera que s'anomena versió de la classe base.

Així hem arribat al final d’aquest article sobre ‘Funció virtual en C ++’. Si voleu obtenir més informació, consulteu el per Edureka, una empresa d’aprenentatge en línia de confiança. El curs de formació i certificació de Java J2EE i SOA d’Edureka està dissenyat per formar-vos tant per a conceptes Java bàsics com avançats, juntament amb diversos marcs Java com Hibernate & Spring.

Tens alguna pregunta? Si us plau, mencioneu-ho a la secció de comentaris d’aquest bloc i us respondrem el més aviat possible.