Question

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 sont non virtuelles pour permettre à la classe de base de contrôler à tout moment le mode d'appel des points de personnalisation.

C’est un langage élégant que j’aime utiliser, mais comment cela fonctionne-t-il si la classe dérivée est une classe de base en elle-même

Était-ce utile?

La solution

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();
};

Autres conseils

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

Vous pouvez simplement écraser complètement la méthode en implémentant la fonction virtuelle. Vous pouvez augmenter la méthode en appelant la fonction de classes "intermédiaires" à un moment donné dans votre méthode de classe dérivée.

Si ce n'est pas ce que vous voulez, vous devez le définir explicitement dans la classe 'intermédiaire'. Je ne serais pas si. Si cela vous tente, cela signifie probablement que vous n'avez pas donné suffisamment de points de personnalisation à la classe de base.

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