8
votes

C ++: Fonctions virtuelles privées contre fonctions virtuelles pures

Dupliqué possible:
Méthode virtuelle privée en C ++

Si j'ai bien compris à partir de ce message ( Méthode virtuelle privée en C ++ ), Faire une fonction virtuelle dans une classe de base rend les classes dérivées capables de le remplacer. Mais il semble que les choses s'arrêtent là.

Mais si la fonction virtuelle de la classe de base est pure, cela oblige les classes dérivées à mettre en œuvre la fonction. Par conséquent, une fonction virtuelle pure (publique) est simplement une interface. Je peux voir un avantage ici.

D'autre part, en faisant une fonction virtuelle de classe de base privée, ne donne que la classe dérivée la capacité de remplacer la fonction, mais je ne vois aucun bénéfice de cela. C'est comme si cette fonction virtuelle privée n'est même pas là. La classe dérivée ne connaît évidemment pas l'existence de cette fonction virtuelle dans la classe de base, car sa privée, de même que son avantage de déclarer une fonction privée de classe de base virtuelle, en termes d'héritage ou de polymorphisme?

Aussi, y a-t-il une situation dans laquelle une classe de base déclarerait une fonction «pur virtuel» et «privé»?

merci.


0 commentaires

3 Réponses :


14
votes

Un avantage est dans la mise en œuvre du Modèle de modement de modèle :

class Base {

 public :
  void doSomething() {
    doSomething1();
    doSomething2();
    doSomething3();
  }
 private:
   virtual void doSomething1()=0;
   virtual void doSomething2()=0;
   virtual void doSomething3()=0;
};


class Derived : public Base {
  private:
   virtual void doSomething1() { ... }
   virtual void doSomething2() { .... }
   virtual void doSomething3() { .... }
}


0 commentaires

0
votes

Si la méthode est virtuelle, elle peut être remplacée par des classes dérivées, même si elle est privée. Quoi qu'il en soit, il devrait être déclaré avec protégé.


3 commentaires

Pourquoi le déclarer-il protégé si vous savez que vous n'aurez jamais besoin d'accéder à la méthode de base des classes dérivées? Vous pouvez remplacer quelque chose sans avoir besoin de pouvoir l'appeler.


Parasht.com/c ++ - FAQ-Lite / Private-Virtuals.HTML < / a>


Aucune raison pour laquelle devrait déclare protégé . Si vous avez besoin protégé , utilisez-le. Sinon, utilisez ensuite privé .



3
votes

C'est pour des situations que la base souhaite que ses enfants appliquent la fonctionnalité que la base elle-même doit être utilisée. Imaginez un exemple idiot - voitures.

class Car {
public:
    int getTorque();
    int getPower();

private:
    virtual const Engine& gimmeEngine() = 0;
};

class Ferrari : public Car {
private:
    FerrariEngine myCoolEngine;
    const Engine& gimmeEngine() { return myCoolEngine; }
};


0 commentaires