2012-07-11 2 views
1
virtual void dev_class::v_func1() 
{ 
    base_class::v_func1(); 
    cout << "This is dev_class's v_func1()" << endl; 
} 

Dans dev_class v-table, base_class::v_func1() a déjà remplacé par dev_class::v_func1(). Alors, pourquoi dev_class::v_func1() peut appeler base_class::v_func1()? Où se trouve l'adresse de fonction base_class::v_func1()?Pourquoi une fonction virtuelle de classe dérivée peut-elle appeler une fonction virtuelle de classe de base? Comment l'outil de compilation?

Répondre

3

Lorsque vous utilisez nom de la fonction qualifiée dans un appel, la fonction spécifiée est appelée directement, sans utiliser de « v-tables ». Cela s'applique aux appels de la fonction membre de la classe de base à partir de la fonction de membre de la classe dérivée (comme dans votre exemple). Cela s'applique également aux appels de fonction membres dans tous les autres contextes.

Par exemple

base_class *p = new dev_class; 
p->v_func1(); // virtual call - calls `dev_class::v_func1` 
p->base_class::v_func1(); // non-virtual call - calls `base_class::v_func1` 

noms de fonctions qualifiés et répriment priorité sur le mécanisme d'envoi virtuel et tourner efficacement appel de fonction de membre virtuel dans un appel de fonction de membre ordinaire.

+0

merci! Je pense savoir ... –

1

Le compilateur connaît simplement les adresses de toutes les tables virtuelles de toutes les classes. C'est la même chose à demander "comment compilateur définit VMT dans le constructeur"? Les adresses des fonctions qui sont stockées dans les VMT sont simplement des fonctions et elles sont connues pour compiler à peu près de la même manière.

2

base_class::v_func1() est appelée sans utiliser la table v, comme toute fonction non virtuelle.

Questions connexes