1. Papel:
Dirección para el puntero objeto tiene funciones virtuales, que deben realizarse para determinar la función real durante la operación
2. Diseño de memoria:
memoria de la cabeza de posición (64), es decir, 8 bytes en el comienzo de los contenidos de la memoria del valor de dirección vtable
función Vtable mientras que el almacenamiento secuencialmente valores de dirección (orden de 64-bit de la matriz)
3. Las llamadas de código:
#include <stdio.h>
#include <iostream>
class P {
public:
virtual void test() {std::cout << "test " << std::endl;}
virtual void testa() {std::cout << "testa " << std::endl;}
private:
int a;
};
class S : public P {
public:
void test() {std::cout << "test s" << std::endl;}
void testc() {std::cout << "test s c" << std::endl;}
private:
int c;
};
int main() {
P *p = new S();
void *ptr = (void*)(*((long*)p));
printf("%x\n", ptr);
void (*fun)(void) = (void(*)(void))(*((long*)ptr));
printf("%x\n", fun);
(fun)();
delete p;
return 0;
}
void * ptr = (* void) (* ((largo *) p)); la dirección obtenida vtable
void (* diversión) (void) = (void (*) (void)) (* ((largo *) PTR)); Obtener puntero de función
nota:
1. Sólo aquellos con clase de objeto virtual tendrá un vtable, para la llamada de función no virtual se puede especificar directamente en el compilador, sin la necesidad de adoptar medidas adicionales para conseguir
caso:
¿Por lo general requiere que el destructor virtual;
Sea P S es la clase padre, entonces destructor generada código predeterminado incluirá automáticamente el código S para llamar al destructor de la clase padre,
Esto puede explicarse cuando se utiliza S s; como variable local, que es capaz de propio destructor procesado a continuación, llamar automáticamente el destructor clase padre (constructor por el contrario), es decir, el código se ha analizado en la subclase función de la estructura,
Sin embargo, cuando se utiliza P * p = new S (); tiempo, si no destructor virtual de p, entonces el destructor ~ P sólo funcionará porque, ~ P () no es una función virtual, entonces no hay en el vtable que determina el destructor llamada,
Durante la compilación se basará en el tipo de P, llamado de ~ P dirigir solamente
Luego, cuando ~ P como el tiempo virtual, ~ P como una función de la viable, que puntos cuando S () cuando ~ P () es una función del punto real ~ S (), y por lo tanto capaz de destrucción completa la función correcta se llama.