logo

Polimorfismo de C++

La palabra polimorfismo significa tener muchas formas. En palabras simples, podemos definir el polimorfismo como la capacidad de un mensaje de mostrarse en más de una forma. Un ejemplo real de polimorfismo es una persona que al mismo tiempo puede tener diferentes características. Un hombre es al mismo tiempo padre, marido y empleado. Entonces la misma persona exhibe comportamiento diferente en diferentes situaciones. Esto se llama polimorfismo. El polimorfismo se considera una de las características importantes de la programación orientada a objetos.

Tipos de polimorfismo

  • Polimorfismo en tiempo de compilación
  • Polimorfismo en tiempo de ejecución
Tipos de polimorfismo

Tipos de polimorfismo

1. Polimorfismo en tiempo de compilación

Este tipo de polimorfismo se logra mediante sobrecarga de funciones o sobrecarga de operadores.



A. Sobrecarga de funciones

Cuando hay varias funciones con el mismo nombre pero con diferentes parámetros, se dice que las funciones son sobrecargado, por lo tanto, esto se conoce como sobrecarga de funciones. Las funciones pueden verse sobrecargadas por cambiando el número de argumentos o y cambiando el tipo de argumentos . En términos simples, es una característica de la programación orientada a objetos que proporciona muchas funciones que tienen el mismo nombre pero parámetros distintos cuando se enumeran numerosas tareas bajo un nombre de función. Existen ciertas reglas de sobrecarga de funciones que se deben seguir al sobrecargar una función.

A continuación se muestra el programa C++ para mostrar la sobrecarga de funciones o el polimorfismo en tiempo de compilación:

C++




// C++ program to demonstrate> // function overloading or> // Compile-time Polymorphism> #include> using> namespace> std;> class> Geeks {> public>:> >// Function with 1 int parameter> >void> func(>int> x)> >{> >cout <<>'value of x is '> << x << endl;> >}> >// Function with same name but> >// 1 double parameter> >void> func(>double> x)> >{> >cout <<>'value of x is '> << x << endl;> >}> >// Function with same name and> >// 2 int parameters> >void> func(>int> x,>int> y)> >{> >cout <<>'value of x and y is '> << x <<>', '> << y> ><< endl;> >}> };> // Driver code> int> main()> {> >Geeks obj1;> >// Function being called depends> >// on the parameters passed> >// func() is called with int value> >obj1.func(7);> >// func() is called with double value> >obj1.func(9.132);> >// func() is called with 2 int values> >obj1.func(85, 64);> >return> 0;> }>

>

botón tkinter

>

Producción

value of x is 7 value of x is 9.132 value of x and y is 85, 64>

Explicación: En el ejemplo anterior, una única función llamada función función() actúa de manera diferente en tres situaciones diferentes, lo cual es una propiedad del polimorfismo. Para saber más sobre esto, puede consultar el artículo: Sobrecarga de funciones en C++ .

B. Sobrecarga del operador

C++ tiene la capacidad de proporcionar a los operadores un significado especial para un tipo de datos; esta capacidad se conoce como sobrecarga de operadores. Por ejemplo, podemos utilizar el operador de suma (+) de la clase de cadena para concatenar dos cadenas. Sabemos que la tarea de este operador es sumar dos operandos. Entonces, un solo operador '+', cuando se coloca entre operandos enteros, los suma y cuando se coloca entre operandos de cadena, los concatena.

A continuación se muestra el programa C++ para demostrar la sobrecarga de operadores:

CPP




quien es urfi javed

// C++ program to demonstrate> // Operator Overloading or> // Compile-Time Polymorphism> #include> using> namespace> std;> class> Complex {> private>:> >int> real, imag;> public>:> >Complex(>int> r = 0,>int> i = 0)> >{> >real = r;> >imag = i;> >}> >// This is automatically called> >// when '+' is used with between> >// two Complex objects> >Complex operator+(Complex>const>& obj)> >{> >Complex res;> >res.real = real + obj.real;> >res.imag = imag + obj.imag;> >return> res;> >}> >void> print() { cout << real <<>' + i'> << imag << endl; }> };> // Driver code> int> main()> {> >Complex c1(10, 5), c2(2, 4);> >// An example call to 'operator+'> >Complex c3 = c1 + c2;> >c3.print();> }>

>

>

Producción

secuencia de fibonacci java
12 + i9>

Explicación: En el ejemplo anterior, el operador '+' está sobrecargado. Por lo general, este operador se usa para sumar dos números (enteros o números de coma flotante), pero aquí el operador está diseñado para realizar la suma de dos números imaginarios o complejos. Para saber más sobre este, consulte el artículo: Sobrecarga del operador .

2. Polimorfismo en tiempo de ejecución

Este tipo de polimorfismo se logra mediante Anulación de funciones . Enlace tardío y polimorfismo dinámico son otros nombres para el polimorfismo en tiempo de ejecución. La llamada a la función se resuelve en tiempo de ejecución en polimorfismo en tiempo de ejecución . Por el contrario, con el polimorfismo en tiempo de compilación, el compilador determina qué llamada de función vincular al objeto después de deducirlo en tiempo de ejecución.

A. Anulación de funciones

Anulación de funciones ocurre cuando una clase derivada tiene una definición para una de las funciones miembro de la clase base. Se dice que esa función base está anulada.

Anulación de funciones en C++

Función anulada Explicación

Polimorfismo en tiempo de ejecución con miembros de datos

Los miembros de datos en C++ no pueden lograr el polimorfismo en tiempo de ejecución. Veamos un ejemplo en el que accedemos al campo mediante la variable de referencia de la clase principal que hace referencia a la instancia de la clase derivada.

C++




// C++ program for function overriding with data members> #include> using> namespace> std;> // base class declaration.> class> Animal {> public>:> >string color =>'Black'>;> };> // inheriting Animal class.> class> Dog :>public> Animal {> public>:> >string color =>'Grey'>;> };> // Driver code> int> main(>void>)> {> >Animal d = Dog();>// accessing the field by reference> >// variable which refers to derived> >cout << d.color;> }>

>

>

Producción

Black>

Podemos ver que la referencia de la clase principal siempre se referirá al miembro de datos de la clase principal.

B. Función virtual

A función virtual es una función miembro que se declara en la clase base utilizando la palabra clave virtual y se redefine (anulada) en la clase derivada.

Algunos puntos clave sobre las funciones virtuales:

  • Las funciones virtuales son de naturaleza dinámica.
  • Se definen insertando la palabra clave virtual dentro de una clase base y siempre se declaran con una clase base y se anulan en una clase secundaria
  • Se llama a una función virtual durante el tiempo de ejecución

A continuación se muestra el programa C++ para demostrar la función virtual:

C++

¿Cómo actualizo Java?




// C++ Program to demonstrate> // the Virtual Function> #include> using> namespace> std;> // Declaring a Base class> class> GFG_Base {> public>:> >// virtual function> >virtual> void> display()> >{> >cout <<>'Called virtual Base Class function'> ><<>' '>;> >}> >void> print()> >{> >cout <<>'Called GFG_Base print function'> ><<>' '>;> >}> };> // Declaring a Child Class> class> GFG_Child :>public> GFG_Base {> public>:> >void> display()> >{> >cout <<>'Called GFG_Child Display Function'> ><<>' '>;> >}> >void> print()> >{> >cout <<>'Called GFG_Child print Function'> ><<>' '>;> >}> };> // Driver code> int> main()> {> >// Create a reference of class GFG_Base> >GFG_Base* base;> >GFG_Child child;> >base = &child;> >// This will call the virtual function> >base->GFG_Base::display();> >// this will call the non-virtual function> >base->imprimir();> }>

>

strep

>

Producción

Called virtual Base Class function Called GFG_Base print function>

Ejemplo 2:

C++




// C++ program for virtual function overriding> #include> using> namespace> std;> class> base {> public>:> >virtual> void> print()> >{> >cout <<>'print base class'> << endl;> >}> >void> show() { cout <<>'show base class'> << endl; }> };> class> derived :>public> base {> public>:> >// print () is already virtual function in> >// derived class, we could also declared as> >// virtual void print () explicitly> >void> print() { cout <<>'print derived class'> << endl; }> >void> show() { cout <<>'show derived class'> << endl; }> };> // Driver code> int> main()> {> >base* bptr;> >derived d;> >bptr = &d;> >// Virtual function, binded at> >// runtime (Runtime polymorphism)> >bptr->imprimir();> >// Non-virtual function, binded> >// at compile time> >bptr->mostrar();> >return> 0;> }>

>

>

Producción

print derived class show base class>