2009-12-15 14 views
6

Si je dérive une classe d'une autre et écrase une fonction, je peux appeler la fonction de base en appelant Base::myFunction() dans l'implémentation de myFunc dans la classe dérivée.Forcer la classe dérivée à appeler la fonction de base

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

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

Merci!

+4

Dans quelle langue est-ce? –

+2

Probablement C++ ('Base :: myFunction' semble C++) –

+0

Je ne peux pas m'empêcher de penser que cela nécessite une programmation orientée aspect, bien que malheureusement les implémentations manquent encore. –

Répondre

21

Non, ce n'est pas possible.
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; 
}; 
+0

+1, j'étais sur le point de poster cette suggestion. – Roddy

+8

Si vous protégez la fonction virtuelle (ou même privée), vous désactivez l'autre code en appelant directement la méthode virtuelle via une référence à la base (pas si elles font référence à un type dérivé, car la classe dérivée peut rendre la méthode publique disponible) –

+0

Cela sert mes besoins! Je vous remercie :) – Mat

0

Vous essayez d'empêcher une classe dérivée de surcharger/surcharger une méthode dans la base. Vous pouvez l'encourager en qualifiant les méthodes de «non substituables» (selon la langue), mais il y a toujours un moyen de contourner le problème. En d'autres termes, vous ne pouvez pas forcer quelqu'un à utiliser votre classe d'une manière particulière, mais dites-lui simplement comment il doit être utilisé.

+1

non - je veux que la méthode soit écrasée - mais je veux que la fonction de base soit appelée avant l'implémentation dans la classe dérivée – Mat

+0

intéressant J'ai reçu un downvote * 3 * ans plus tard sans commentaire. – hometoast

0

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 appellent les classes héritées sont les constructeurs et les destructeurs.