C ++ tabla de función virtual polimórfico - polimorfismo de realización: función virtual y vtable

 
 entrevista C ++ pregunta frecuente es el principio de múltiples estados. Si la comprensión de la naturaleza de la orientación a objetos C ++ no es particularmente buena, pregunte aquí se derrumbará. Los siguientes principios básicos que, elaboran múltiples estados: & función virtual tabla de función virtual.
 

1. La naturaleza polimórfica:

Formalmente, el uso de una matriz unificada para hacer un tratamiento general de puntero. Sin embargo, la implementación real, este puntero puede apuntar a un objeto de subclase.

Formalmente, la llamada original a la clase padre, pero, de hecho, llama al método subclase del mismo nombre.

Francamente, el polimorfismo a través de punteros es utilizar el método de la clase padre, clase padre y la subclase puede llamar suyo. Si no polimórfica, por subclases llamadas con el puntero de la clase padre, también llamado el método de la clase padre.

Referencia detallada: C ++ tabla de función polimórfica virtual - polimorfismo sencillo uso

 

[Nota]

Cuando la ejecución del programa, un puntero al objeto clase padre de la clase padre, o los objetos sub-clase, no se resuelve formalmente. Sólo a través de un mecanismo de multi-estado para llevar a cabo el método correspondiente real.

 

2. Funciones virtuales:

Antes de que el método de la función de la clase padre, puede aumentar la función virtual se convierte en la función virtual, como por ejemplo:

Tenga en cuenta que, con las funciones de ejemplo en línea, cuando el paquete al exterior, en particular el primer método implementado sin añadir virtual, con el error.

1  clase Padre
 2  {
 3  pública :
 4      virtual  vacío de reproducción ()              de la clase padre // método play () antes de aumentar la palabra clave virtual, esta función se ha convertido en la función virtual 
5      {
 6          std :: cout << " Se trata de una clase padre Play " << std :: endl;
 7.      }
 8.  };
 9.  
10  clase Hijo: pública Padre
 . 11  {
 12 es  pública :
 13 es      nula de reproducción ()
 14      {
 15          std :: << COUT" Esta es una subclase de Juego " << std :: endl;
 16      }
 17. };

 

3. Funciones virtuales Herencia:

Si una función miembro se declaró virtual, por lo subclases [que] en una clase heredada funciones miembro derivadas, funciones virtuales se convertirá.

Si anular esta función virtual en una subclase, no puede escribir virtual, se recomienda escribir virtual, sería más códigos legibles, tales como 13 filas:

. 1  clase Padre
 2  {
 3.  Pública :
 . 4      virtual  vacío de reproducción ()                                         // clase padre método para aumentar la palabra clave virtual antes, esta función será virtual de reproducción () 
. 5      {
 . 6          std :: tribunal << " Esta es una clase padre Juega " << std :: endl;
 7.      }
 8.  };
 9.  
10  clase Hijo: pública Padre
 11.  {
 12 es  pública :
 13 es      virtual  vacío de reproducción ()                                        // antes de la función virtual clase derivada hereda, no se puede agregar virtual, que hace que el código sea más legible, pero con
 14      {
 15          std :: tribunal << " Esta es una subclase de Juego " << std :: endl;
 16      }
 17 };

 

 

4. El principio de las funciones virtuales:

Principio de función virtual se logra a través de tablas de funciones virtuales, tablas de funciones virtuales están fuera del compilador de hacer las cosas que no existe con el objeto, mirada en el código de abajo:

1 #include <iostream>
 2  usando  espacio de nombres std;
3  
4  clase Padre
 5  {
 6  pública :
 7      virtual de  vacío func_1 () {cout << " Padre :: func_1 " << endl; }
 8      virtuales  vacío func_2 () {cout << " Padre :: func_2 " << endl; }
 9      virtuales  vacío func_3 () {cout << " Padre :: func_3 " << endl;
      12 es  
13 es  int principal ( void )
 14  {
 15      Padre father_1;         // tabla de función virtual se almacena en el objeto en el interior del padre 
16  
17.      COUT << " el sizeof (father_1) == " << el sizeof (father_1) << endl;
 18 es  
. 19 }

Después de ejecutar imprimirlo y ver la cantidad de espacio de memoria ocupado por el padre objeto.

resultados de funcionamiento: sizeof (father_1) == 4

¿Por qué tres funciones virtuales sólo 4 bytes? Debido a que es una tabla almacenada, no ocupan memoria objeto espacial, el objeto existe sólo un puntero a una tabla de función virtual, el siguiente lateral esquemática, no importa cuántos usted tiene función virtual, tabla de función virtual que:

    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

================================================== ================================================== =======================

Supongo que te gusta

Origin www.cnblogs.com/CooCoChoco/p/12549792.html
Recomendado
Clasificación