logo

Funció virtual C++

  • Una funció virtual C++ és una funció membre de la classe base que redefiniu en una classe derivada. Es declara mitjançant la paraula clau virtual.
  • S'utilitza per dir al compilador que realitzi un enllaç dinàmic o un enllaç tardà a la funció.
  • Hi ha una necessitat d'utilitzar el punter únic per referir-se a tots els objectes de les diferents classes. Per tant, creem el punter a la classe base que fa referència a tots els objectes derivats. Però, quan el punter de classe base conté l'adreça de l'objecte de classe derivat, sempre executa la funció de classe base. Aquest problema només es pot resoldre mitjançant la funció 'virtual'.
  • Un 'virtual' és una paraula clau que precedeix la declaració normal d'una funció.
  • Quan la funció es fa virtual, C++ determina quina funció s'ha d'invocar en temps d'execució en funció del tipus d'objecte apuntat pel punter de classe base.

Enquadernació tardana o enllaç dinàmic

A la tarda, la trucada de funció vinculant es resol durant el temps d'execució. Per tant, el compilador determina el tipus d'objecte en temps d'execució i després enllaça la crida a la funció.


Regles de la Funció Virtual

llista de tipus de lletra a gimp
  • Les funcions virtuals han de ser membres d'alguna classe.
  • Les funcions virtuals no poden ser membres estàtics.
  • S'hi accedeix mitjançant punters d'objectes.
  • Poden ser amics d'una altra classe.
  • S'ha de definir una funció virtual a la classe base, encara que no s'utilitzi.
  • Els prototips d'una funció virtual de la classe base i totes les classes derivades han de ser idèntics. Si les dues funcions tenen el mateix nom però prototips diferents, C++ les considerarà com a funcions sobrecarregades.
  • No podem tenir un constructor virtual, però sí un destructor virtual
  • Considereu la situació en què no fem servir la paraula clau virtual.
 #include using namespace std; class A { int x=5; public: void display() { std::cout &lt;&lt; &apos;Value of x is : &apos; &lt;&lt; x&lt;<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;>

Sortida:

 Value of x is : 5 

A l'exemple anterior, * a és el punter de la classe base. El punter només pot accedir als membres de la classe base però no als membres de la classe derivada. Tot i que C++ permet que el punter base apunti a qualsevol objecte derivat de la classe base, no pot accedir directament als membres de la classe derivada. Per tant, hi ha una necessitat d'una funció virtual que permeti al punter base accedir als membres de la classe derivada.

Exemple de funció virtual de C++

Vegem l'exemple senzill de la funció virtual C++ utilitzada per invocar la classe derivada en un programa.

 #include { public: virtual void display() { cout &lt;&lt; &apos;Base class is invoked&apos;&lt;<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;>

Sortida:

 Derived Class is invoked 

Pura funció virtual

  • No s'utilitza una funció virtual per realitzar cap tasca. Només serveix com a marcador de posició.
  • Quan la funció no té definició, aquesta funció es coneix com ' no fer res 'funció.
  • el ' no fer res La funció es coneix com a funció virtual pura . Una funció virtual pura és una funció declarada a la classe base que no té cap definició relativa a la classe base.
  • Una classe que conté la funció virtual pura no es pot utilitzar per declarar els seus propis objectes, aquestes classes es coneixen com a classes base abstractes.
  • L'objectiu principal de la classe base és proporcionar els trets a les classes derivades i crear el punter base utilitzat per aconseguir el polimorfisme en temps d'execució.

La funció virtual pura es pot definir com:

 virtual void display() = 0; 

Vegem un exemple senzill:

canviar el nom de la carpeta de Linux
 #include using namespace std; class Base { public: virtual void show() = 0; }; class Derived : public Base { public: void show() { std::cout &lt;&lt; &apos;Derived class is derived from the base class.&apos; <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();>

A l'exemple anterior, la classe base conté la funció virtual pura. Per tant, la classe base és una classe base abstracta. No podem crear l'objecte de la classe base.