polimorfismo
El polimorfismo es una de las características importantes de la programación orientada a objetos. El significado literal puede entenderse simplemente como: múltiples formas, múltiples apariencias. De hecho, el significado esencial es el mismo: en la programación orientada a objetos, significa que el mismo método tendrá diferentes efectos de ejecución cuando lo ejecuten diferentes objetos.
Específicamente, la implementación del polimorfismo se puede dividir en dos tipos: polimorfismo en tiempo de compilación y polimorfismo en tiempo de ejecución. El primero es el proceso de operación específico que se determina al compilar, y el segundo es el proceso de operación que solo se determina durante la ejecución del programa. Esta determinación del proceso de operación es vinculante , también conocida como vinculante .
El enlace que se confirma durante la compilación y la conexión se llama enlace estático . La sobrecarga de funciones y la creación de instancias de plantillas de funciones que aprendimos anteriormente entran en esta categoría. El otro es confirmar qué fragmento de código se ejecuta durante la ejecución, lo que se denomina enlace dinámico . En este caso, no es posible confirmar qué fragmento de código se ejecuta durante la compilación, pero solo se puede confirmar después de que se ejecuta el programa. correr.
Comparando los dos, el enlace estático ya ha determinado cómo ejecutarlo durante la compilación, por lo que es eficiente en la ejecución, mientras que el enlace dinámico debe ser más lento, pero su ventaja es la flexibilidad; Ambos tienen sus propios méritos y diferentes escenarios de uso.
A continuación, le daremos un ejemplo sencillo sobre enlaces estáticos:
/************************************//Des: Demostración del tutorial de C++//Autor: Huang/ /Copyright:www.dotcpp.com//Fecha:2017/12/20********************************* *** *******/#include<iostream>usingnamespacestd;#definePI3.1415926classPoint{privado:intx,y;public:Point(intx=0,inty=0){this->x=x;this ->y =y;}doublearea(){return0.0;}};classCircle:publicPoint{private:intr;public:Circle(intx,inty,intR):Point(x,y){r=R;}doublearea (){ returnPI*r*r;}};intmain(){PuntoA(10,10);cout<<A.area()<<endl;CircleB(10,10,20);cout<<B.area ()< <endl;Punto*p;p=&B;cout<<p->area()<<endl;Punto&pp=B;cout<<pp.area()<<endl;return0;}
Se definen dos clases, una clase de punto y una clase de círculo derivada. Puede ver el código de la función principal y los cuatro resultados del área de salida.
Puede comparar el código para comprender los cuatro resultados:
El primer cout genera el área de A, que es el método de área en la clase Punto. El área es 0, por lo que no hay problema.
El segundo cout genera el área de B, que obviamente es el método de área de la clase derivada Círculo. El área se calcula naturalmente de acuerdo con la fórmula y el valor es 1256,64, lo cual no es un problema.
El tercer cout genera el método de área del objeto de clase Círculo señalado por el puntero de tipo Punto p. Genera 0, que obviamente es el método de área en la clase Punto. Lo que C++ implementa aquí es enlace estático, es decir, al compilar, determina qué área ejecutar según el tipo de p, por lo que es 0.
El cuarto tipo de cout funciona de la misma manera. Asigna un objeto de tipo Círculo a una referencia de tipo Punto. También realiza un enlace estático y también genera 0.
Obviamente, este no es el resultado que esperamos. De hecho, para los punteros y las referencias, preferimos ejecutar los métodos de los objetos reales, en lugar de determinar ciegamente los tipos de punteros y referencias. Este es el problema si se escribe así.
Si desea cumplir con nuestros requisitos, no importa de qué tipo sea el puntero o la referencia, debe decidirse de manera flexible en función del objeto real al que apunta. Luego, debemos cambiar este método de enlace estático predeterminado y usar el enlace dinámico, es decir, decidirlo de manera flexible en tiempo de ejecución.
¡En la siguiente sección, las funciones virtuales se explicarán en detalle para todos!