Primero, introduzcamos nuestro nuevo punto de conocimiento: la función virtual .
¿Qué tipo de función es esta? En pocas palabras, es una función declarada con virtual delante de una función. La forma general es la siguiente:
función virtual valor de retorno nombre de la función (parámetro formal) {cuerpo de la función}
Entonces, ¿para qué se utiliza? La aparición de funciones virtuales permite establecer la conexión entre la función y el cuerpo de la función en tiempo de ejecución, que es el llamado enlace dinámico . Luego, cuando se ejecuta la clase derivada de la función virtual, se puede lograr el efecto de ejecutar el mismo método pero con diferentes resultados de acuerdo con el enlace dinámico en tiempo de ejecución, que es el llamado polimorfismo. De esta forma, existe una forma de solucionar el problema del apartado anterior.
A continuación, solo necesitamos declarar el método de área en la clase base como una función virtual, y luego cualquier puntero o referencia de tipo Punto en la función principal se puede llamar con valentía, y no hay necesidad de preocuparse por problemas de tipo. Porque decidirán a qué método llamar en función del tipo de objeto real para lograr un enlace dinámico.
El código es el siguiente:
/************************************//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;}virtualdoublearea(){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;}
Después de la modificación, compile y ejecute de la siguiente manera:
Experimente en su propia computadora para experimentar el papel de las funciones virtuales y el polimorfismo.
Las cosas a tener en cuenta son:
1. Las funciones virtuales no pueden ser funciones miembro estáticas o funciones amigas porque no pertenecen a un objeto.
2. Las funciones en línea no pueden determinar dinámicamente su ubicación durante el tiempo de ejecución. Incluso si la función virtual está definida dentro de la clase, aún se considerará no en línea durante la compilación.
3. El constructor no puede ser una función virtual y el destructor puede ser una función virtual y generalmente se declara como una función virtual.