c ++ vtable la tabla de función virtual

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.


Publicados 140 artículos originales · ganado elogios 28 · vistas 180 000 +

Supongo que te gusta

Origin blog.csdn.net/qq_16097611/article/details/78932019
Recomendado
Clasificación