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.

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top