Question

Si je tire une classe d'un autre et écrasez une fonction, je peux appeler la fonction de base en appelant Base::myFunction() dans la mise en œuvre de myFunc dans la classe dérivée.

However- est-il un moyen de définir dans ma classe de Base que la fonction de base est appelée dans tous les cas, même sans l'avoir appelé explicitement dans la fonction écrasée? (Avant ou après la fonction dérivée exécuté)

Ou mieux encore, si j'ai une fonction virtuelle dans ma classe virtuelle Base, et deux fonctions privées mises en œuvre before() et after(), est-il possible de définir dans la classe Base que, avant et après la fonction dans une classe dérivée de cette Base classe est appelée, before() et after() seront appelés?

Merci!

Était-ce utile?

La solution

Non, cela est impossible.
Mais vous pouvez simuler en appelant une fonction virtuelle différente comme ceci:

class Base
{
public:
  void myFunc()
  {
    before();
    doMyFunc();
    after();
  }

  virtual void doMyFunc() = 0;
};

Autres conseils

Vous essayez d'éviter une classe dérivée de la surcharge / redéfinir une méthode dans la base. Vous pouvez l'encourager par des méthodes de marquage comme « non substituable » (selon la langue), mais il y a toujours un moyen de contourner.

En d'autres termes, vous ne pouvez pas forcer quelqu'un à utiliser votre classe d'une certaine façon, leur dire que la façon dont il doit être utilisé.

Réponse C ++, vous ne pouvez pas avoir une fonction héritée « invisiblement » appelé de la manière que vous voulez.

Les seules méthodes qui font appel à travers les classes héritées sont des constructeurs et destructeurs.

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