compréhension Confusion appel de fonction virtuelle et la classe de base dépendante
-
27-10-2019 - |
Question
Je lis ebook Modèles guide complet et la question que je vais demander peut-être stupide pour vous, mais ..
Il y a section que 9.4.2 Classes de base à charge 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 à visualiser la ligne (ou domaine de problème) dans le texte ci-dessus « Il faut prendre soin de cette solution, car si le nom non qualifié non-dépendante est utilisé pour former un appel de fonction virtuelle, puis la qualification inhibe le virtuel mécanisme d'appel, le sens des changements de programme. Néanmoins, il y a des situations où la première variation ne peut pas être utilisé et cette solution est appropriée "
Je comprends etc nom non qualifié, mais non dépendantes les mélangeant avec appel de fonction virtuelle est ce qui me éludant.
La solution
Si le nom qualifié (BASEFIELD) est une fonction virtuelle, puis 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
}
Autres conseils
L'utilisation d'un inhibe class-name::function()
-identificateur qualifié-ness virtuelle de function
, vous devez donc utiliser this->function()
à la place.
Cela fonctionne aussi pour les membres de données. this->basefield