¿Cómo implementar la función virtual en C ++?



Este artículo le presentará otro concepto de programación que es la función virtual en C ++. El concepto estará respaldado por una demostración.

Una función virtual en C++ es una función miembro dentro de la clase base que redefinimos en una clase derivada. Este artículo le ayudará a explorar el concepto en detalle. Los siguientes consejos se cubrirán en este artículo,

Así que comencemos con este artículo sobre la función virtual en C ++





¿Qué es la función virtual?

Una función virtual es una función miembro dentro de la clase base que redefinimos en una clase derivada. Se declara utilizando la palabra clave virtual. Cuando se hereda una clase que contiene una función virtual, la clase derivada redefine la función virtual para satisfacer sus propias necesidades.

Continuando con este artículo sobre la función virtual en C ++



Reglas para la función virtual en C ++:

  • Siempre se definen en una clase base y se anulan en la clase derivada, pero no es obligatorio anular en la clase derivada.
  • Las funciones virtuales deben declararse en la sección pública de la clase.
  • No pueden ser funciones estáticas o amigas y tampoco pueden ser la función virtual de otra clase.
  • Se debe acceder a las funciones virtuales usando un puntero para lograr polimorfismo en tiempo de ejecución.

Continuando con este artículo sobre la función virtual en C ++.

¿Qué es vinculante?

La vinculación de funciones significa que siempre que haya una llamada a una función, el compilador necesita saber con qué definición de función debe coincidir. Esto depende de la firma de cada declaración de función y de las asignaciones que se tomen. Además, el compilador necesita saber cuándo ocurrirá esta coincidencia entre la llamada a la función y la elección de la definición correcta.

Continuando con este artículo sobre la función virtual en C ++



Encuadernación temprana

La vinculación temprana es un fenómeno en el que la decisión de hacer coincidir varias llamadas de función se produce en el momento de la compilación y el compilador asocia directamente el enlace con las direcciones. También se conoce como enlace estático o enlace en tiempo de compilación.

  • Como sabemos, escribimos código en lenguaje de alto nivel.
  • Luego, el compilador convierte esto en un lenguaje de bajo nivel que la computadora pueda entender, principalmente lenguaje de máquina en el momento de la compilación.
  • En el enlace temprano, el compilador proporciona directamente la dirección de la instrucción de declaración de función a la instrucción de llamada de función
  • Por lo tanto, como sugiere el nombre, el enlace ocurre muy temprano antes de que se ejecute el programa.

Ejemplo

#incluya el uso del espacio de nombres std class Animals {public: void sound () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <sound () // retorno de enlace anticipado 0}

Salida

Salida- Función virtual en C ++ - Edureka

aclaraciones ion
En este ejemplo, creamos un puntero a la clase principal Animals. Luego, al escribir a = & c, el puntero 'a' comenzó a referirse al objeto c de la clase Cats.
a -> sound () - Al llamar a la función sound () que está presente en ambas clases mediante el puntero 'a', se llamó a la función de la clase padre, incluso si el puntero se refiere al objeto de la clase Cats .

Esto se debe al enlace anticipado. Sabemos que 'a' es un puntero de la clase principal que se refiere al objeto de la clase secundaria. Dado que el enlace temprano tiene lugar en tiempo de compilación, cuando el compilador vio que 'a' es un puntero de la clase principal, hizo coincidir la llamada con la función 'sound ()' de la clase principal sin buscar el objeto, el puntero. se refiere a.

Continuando con este artículo sobre la función virtual en C ++

Encuadernación tardía

En el enlace tardío, el compilador identifica el objeto en tiempo de ejecución y luego hace coincidir la llamada a la función con la función correcta. También se conoce como enlace dinámico o enlace en tiempo de ejecución.

El enlace tardío en el problema anterior se puede resolver utilizando una palabra clave virtual en la clase base. Veamos cómo sucede esto utilizando el ejemplo anterior, pero solo agregando una palabra clave virtual.

Ejemplo

#incluya el uso del espacio de nombres std class Animals {public: virtual void sound () {cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <sonido () return 0}

Salida

Explicación
Aquí la función sound () de la clase base se hace virtual, por lo que el compilador ahora realiza un enlace tardío para esta función. Ahora, la llamada de función de la función sound () coincidirá con la definición de la función en tiempo de ejecución. Dado que el compilador ahora identifica el puntero 'a' como una referencia al objeto 'c' de la clase derivada Cats, llamará a la función sound () de la clase Cats.

Continuando con este artículo sobre la función virtual en C ++

Función virtual pura

Una función virtual pura en C ++ es una función virtual para la que no tenemos una implementación, solo la declaramos. Una función virtual pura se declara asignando 0 en la declaración.

que es un desarrollador blockchain

sonido de vacío virtual () = 0

Aquí sound () es una función virtual pura.

Continuando con este artículo sobre la función virtual en C ++

Clase abstracta

Una clase abstracta se define como una clase con una o más funciones virtuales puras. Como se explicó anteriormente, la función virtual pura es una función miembro virtual que está marcada como sin implementación. No se puede implementar con la información proporcionada en la clase, incluidas las clases base. Una clase abstracta también se conoce como clase base abstracta.

Ejemplo

#incluir usando el espacio de nombres std class Employee // clase base abstracta {virtual int getSalary () = 0 // función virtual pura} class Employee_1: public Employee {int salario public: Employee_1 (int s) {salario = s} int getSalary () {return salario}} clase Employee_2: public Employee {int salario public: Employee_2 (int t) {salario = t} int getSalary () {return salario}} int main () {Employee_1 e1 (5000) Employee_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 } 

Salida

Explicación
La función 'getSalary ()' en la clase Empleado es una función virtual pura. Dado que la clase Empleado contiene la función virtual pura, es una clase base abstracta.
Dado que la función virtual pura se define en las subclases, la función 'getSalary ()' se define en ambas subclases de la clase Empleado, es decir, Empleado_1 y Empleado_2.

Continuando con este artículo sobre la función virtual en C ++

Ejemplo de función virtual

#incluir usando el espacio de nombres 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 función_2 () ptr-> función_3 () ptr-> función_4 ()}

Salida

Explicación
Para la llamada de función function_1 (), se llama a la versión de la función de la clase base, function_2 () se anula en la clase derivada, por lo que se llama a la versión de la clase derivada, function_3 () no se anula en la clase derivada y es una función virtual, por lo que se llama a la versión de la clase base, de manera similar, function_4 () no se anula, por lo que se llama a la versión de la clase base.

Por lo tanto, hemos llegado al final de este artículo sobre 'Función virtual en C ++'. Si desea obtener más información, consulte el por Edureka, una empresa de aprendizaje en línea de confianza. El curso de certificación y capacitación Java J2EE y SOA de Edureka está diseñado para capacitarlo en conceptos básicos y avanzados de Java junto con varios marcos de Java como Hibernate y Spring.

Tienes una pregunta para nosotros? Menciónelo en la sección de comentarios de este blog y nos pondremos en contacto con usted lo antes posible.