2008-09-22 5 views
5

L'idiome d'interface non virtuelle décrit comment les méthodes virtuelles sont des points de personnalisation non publics et les méthodes publiques ne sont pas virtuelles pour permettre à la classe de base de contrôler à tout moment l'appel des points de personnalisation.idiome d'interface non virtuelle pour plus de deux niveaux d'héritage?

C'est un idiome élégant et j'aime l'utiliser, mais comment ça marche si la classe dérivée est une classe de base en elle-même

Répondre

5

Cela fonctionne, car la classe dérivée peut remplacer une fonction virtuelle privée d'une classe de base, même si la fonction de classe de base remplace sa fonction de classe de base.

Ceci est parfaitement légal:


class Parent 
{ 
public: 
    int foo() {return bar();} // the non-virtual public interface 
private 
    virtual int bar(); 
}; 

class Child : public Parent 
{ 
private: 
    virtual int bar(); // overrides Parent::bar() 
}; 

class Grandchild : public Child 
{ 
private: 
    virtual int bar(); // overrides Child::bar(); 
}; 
1

La classe dérivée peut décider elle-même:

Vous pouvez juste remplacer complètement la méthode en implémentant la fonction virtuelle. Vous pouvez augmenter la méthode en appelant la fonction classes 'middle' à un moment donné dans votre méthode de classe dérivée.

Si ce n'est pas ce que vous voulez, vous devez le configurer explicitement dans la classe 'middle'. Je ne voudrais pas cependant. Si vous le souhaitez, cela signifie probablement que vous n'avez pas donné suffisamment de points de personnalisation à la classe de base.

Questions connexes