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.