2011-10-20 2 views
3

Je lis modèles ebook guide complet et question que je vais demander peut-être stupide pour vous, mais ..compréhension appel de fonction virtuelle et classe de base dépendante

Il y a dans la section qui 9.4.2 à charge Classes de base que je suis incapable de comprendre.

Voici le texte partiel de celui-ci: http://tinypaste.com/633f0

// Variation 2: 
template<typename T> 
class DD2 : public Base<T> { 
    public: 
    void f() { Base<T>::basefield = 0; } 
}; 

je besoin d'aide pour visualiser la ligne (ou domaine de problème) dans le texte ci-dessus "Il faut prendre soin de cette solution, car si le non qualifié nom non dépendantes est utilisé pour former un appel de fonction virtuelle, alors la qualification inhibe le mécanisme d'appel virtuel et la signification des changements de programme.Il y a cependant des situations où la première variation ne peut pas être utilisée et cette alternative est appropriée "

Je comprends inégal ified nom non-dépendants, etc, mais les mélanger avec l'appel de fonction virtuelle est ce qui me échappe.

+4

Ceci est une sentance horrible n'est-ce pas, ce code semble être conçu pour permettre un comportement polymorphe non virtuel. C'est à dire. votre classe dérivée peut remplacer les méthodes de votre classe de base, mais la recherche est effectuée au moment de la compilation. Je soupçonne que "Inhibiting" dans ce sens signifie que vous n'obtiendrez pas la recherche dynamique habituelle basée sur vtable runtime .... – Benj

+0

Besoin de plus de contexte. Quel est le problème que ce code tente de résoudre? –

Répondre

2

Si le nom qualifié (basefield) est une fonction virtuelle, la qualification inhibe l'appel virtuel. Il est très bien la même chose que si vous avez:

struct Base { 
    virtual void vCall() { } 
}; 

struct Derived : public Base { 
    virtual void vCall() { } 
}; 

int main() { 
    Derived d; 
    Base* inst = &d; 
    inst->Base::vCall(); // By qualifying we won't get virtual dispatch; 
         // this calls Base::vCall directly 
} 
1

L'utilisation d'un identificateur qualifié class-name::function() inhibe-ness virtuelle de function, vous devez donc utiliser this->function() à la place.

Cela fonctionne également pour les membres de données: this->basefield.

Questions connexes