logo

Función virtual C++

  • Una función virtual de C++ es una función miembro de la clase base que se redefine en una clase derivada. Se declara utilizando la palabra clave virtual.
  • Se utiliza para indicarle al compilador que realice un enlace dinámico o un enlace tardío en la función.
  • Es necesario utilizar un puntero único para hacer referencia a todos los objetos de las diferentes clases. Entonces, creamos el puntero a la clase base que hace referencia a todos los objetos derivados. Pero, cuando el puntero de la clase base contiene la dirección del objeto de clase derivada, siempre ejecuta la función de la clase base. Este problema sólo se puede resolver utilizando la función 'virtual'.
  • Un 'virtual' es una palabra clave que precede a la declaración normal de una función.
  • Cuando la función se vuelve virtual, C++ determina qué función se invocará en el tiempo de ejecución según el tipo de objeto señalado por el puntero de clase base.

Enlace tardío o enlace dinámico

En el enlace tardío, la llamada a la función se resuelve durante el tiempo de ejecución. Por lo tanto, el compilador determina el tipo de objeto en tiempo de ejecución y luego vincula la llamada a la función.


Reglas de la función virtual

lista de usuarios de mysql
  • Las funciones virtuales deben ser miembros de alguna clase.
  • Las funciones virtuales no pueden ser miembros estáticos.
  • Se accede a ellos a través de punteros de objetos.
  • Pueden ser amigos de otra clase.
  • Se debe definir una función virtual en la clase base, aunque no se utilice.
  • Los prototipos de una función virtual de la clase base y de todas las clases derivadas deben ser idénticos. Si las dos funciones tienen el mismo nombre pero prototipos diferentes, C++ las considerará funciones sobrecargadas.
  • No podemos tener un constructor virtual, pero sí un destructor virtual.
  • Considere la situación en la que no utilizamos la palabra clave 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;>

Producción:

 Value of x is : 5 

En el ejemplo anterior, * a es el puntero de clase base. El puntero sólo puede acceder a los miembros de la clase base pero no a los miembros de la clase derivada. Aunque C++ permite que el puntero base apunte a cualquier objeto derivado de la clase base, no puede acceder directamente a los miembros de la clase derivada. Por lo tanto, existe la necesidad de una función virtual que permita al puntero base acceder a los miembros de la clase derivada.

Ejemplo de función virtual de C++

Veamos el ejemplo simple de la función virtual de C++ utilizada para invocar la clase 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;>

Producción:

 Derived Class is invoked 

Función virtual pura

  • Una función virtual no se utiliza para realizar ninguna tarea. Sólo sirve como marcador de posición.
  • Cuando la función no tiene definición, dicha función se conoce como ' hacer nada ' función.
  • El ' hacer nada La función se conoce como función virtual pura . Una función virtual pura es una función declarada en la clase base que no tiene ninguna definición relativa a la clase base.
  • Una clase que contiene la función virtual pura no se puede utilizar para declarar sus propios objetos; dichas clases se conocen como clases base abstractas.
  • El objetivo principal de la clase base es proporcionar características a las clases derivadas y crear el puntero base utilizado para lograr el polimorfismo en tiempo de ejecución.

La función virtual pura se puede definir como:

 virtual void display() = 0; 

Veamos un ejemplo sencillo:

ex de nombre de usuario
 #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();>

En el ejemplo anterior, la clase base contiene la función virtual pura. Por tanto, la clase base es una clase base abstracta. No podemos crear el objeto de la clase base.