c ++ vtable la table de fonctions virtuelles

1. Rôle:

Adresse pour le pointeur d'objet a des fonctions virtuelles, qui doivent être effectuées pour déterminer la fonction réelle pendant le fonctionnement


2. Disposition de la mémoire:

La mémoire de la position tête (64), à savoir 8 octets au début du contenu de la mémoire de la valeur d'adresse vtable

fonction Vtable tandis que les valeurs d'adresse stockant séquentiellement (de l'ordre de 64 bits de la matrice)


3. Les appels de code:

#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 *) (* ((long *) p)); l'adresse obtenue vtable

void (* fun) (void) = (void (*) (void)) (* ((long *) PTR)); Pointeur de fonction


Remarque:

1. Seuls ceux qui ont la classe d'objet virtuel aura un vtable, pour un appel de fonction non virtuelle peut être spécifié directement dans le compilateur, sans la nécessité d'une action supplémentaire pour obtenir


Cas:

Pourquoi exige généralement la destructor virtuelle;

Soit P S est la classe parente, puis le code par défaut généré destructor inclura automatiquement le code S pour appeler la classe parente destructor,

Ceci peut être expliqué lors de l'utilisation Ss, comme variable locale, qui est capable de traiter propre destructor ensuite appeler automatiquement la classe parente destructor (constructeur au contraire), à ​​savoir, le code a été analysé dans la sous-classe fonction de structure,

Cependant, lorsque vous utilisez P * p = new S (), le temps, sinon destructor virtuelle de p, le destructor ~ P ne fonctionne parce que, ~ P ​​() n'est pas une fonction virtuelle, aucune dans le vtable qui détermine le destructeur d'appel,

Au cours de la compilation sera basée sur le type de P, l'appel ~ P directs seulement

Puis, quand ~ P comme temps virtuel, ~ P ​​en fonction de la vtable, qui pointe lorsque S () quand il ~ P () est une fonction du point réel ~ S (), et donc en mesure de destruction complète fonction correcte est appelée.


Publié 140 articles originaux · louange gagné 28 · vues 180 000 +

Je suppose que tu aimes

Origine blog.csdn.net/qq_16097611/article/details/78932019
conseillé
Classement