Malgré tous les appels à déclarer un membre virtuel privé, l'argument ne tient tout simplement pas la route. Souvent, le remplacement d'une fonction virtuelle par une classe dérivée devra appeler la version de la classe de base. Il ne peut pas s'il est déclaré private
:
class Base
{
private:
int m_data;
virtual void cleanup() { /*do something*/ }
protected:
Base(int idata): m_data (idata) {}
public:
int data() const { return m_data; }
void set_data (int ndata) { m_data = ndata; cleanup(); }
};
class Derived: public Base
{
private:
void cleanup() override
{
// do other stuff
Base::cleanup(); // nope, can't do it
}
public:
Derived (int idata): base(idata) {}
};
Vous devez déclarer la méthode de classe de base protected
.
Ensuite, vous devez prendre le vilain expédient d'indiquer via un commentaire que la méthode doit être surchargée mais pas appelée.
class Base
{
...
protected:
// chained virtual function!
// call in your derived version but nowhere else.
// Use set_data instead
virtual void cleanup() { /* do something */ }
...
Ainsi la ligne directrice n ° 3 de Herb Sutter ... Mais le cheval est de toute façon hors de la grange.
Lorsque vous déclarez quelque chose, protected
vous faites implicitement confiance à l'écrivain de toute classe dérivée pour comprendre et utiliser correctement les composants internes protégés, tout comme une friend
déclaration implique une confiance plus profonde pour les private
membres.
Les utilisateurs qui ont un mauvais comportement en violant cette confiance (par exemple étiquetés «ignorants» en ne prenant pas la peine de lire votre documentation) n'ont qu'à eux-mêmes à blâmer.
Mise à jour : j'ai eu quelques retours qui prétendent que vous pouvez "enchaîner" les implémentations de fonctions virtuelles de cette façon en utilisant des fonctions virtuelles privées. Si tel est le cas, j'aimerais bien le voir.
Les compilateurs C ++ que j'utilise ne laisseront certainement pas une implémentation de classe dérivée appeler une implémentation de classe de base privée.
Si le comité C ++ relâchait "privé" pour permettre cet accès spécifique, je serais tout pour les fonctions virtuelles privées. Dans l'état actuel des choses, on nous conseille toujours de verrouiller la porte de la grange après le vol du cheval.