Nonostante tutte le chiamate a dichiarare privato un membro virtuale, l'argomento semplicemente non regge. Spesso, l'override di una classe derivata di una funzione virtuale dovrà chiamare la versione della classe base. Non può se è dichiarato 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) {}
};
È necessario dichiarare il metodo della classe base protected.
Quindi, devi prendere il brutto espediente di indicare tramite un commento che il metodo dovrebbe essere sovrascritto ma non chiamato.
class Base
{
...
protected:
// chained virtual function!
// call in your derived version but nowhere else.
// Use set_data instead
virtual void cleanup() { /* do something */ }
...
Così la linea guida n. 3 di Herb Sutter ... Ma il cavallo è comunque fuori dalla stalla.
Quando dichiari qualcosa, protectedti fidi implicitamente dello scrittore di qualsiasi classe derivata per comprendere e utilizzare correttamente le parti interne protette, proprio nel modo in cui una frienddichiarazione implica una fiducia più profonda per i privatemembri.
Gli utenti che si comportano male violando quella fiducia (ad esempio etichettati come "incapaci" perché non si preoccupano di leggere la tua documentazione) hanno solo se stessi da incolpare.
Aggiornare : ho ricevuto un feedback che afferma che è possibile "concatenare" le implementazioni di funzioni virtuali in questo modo utilizzando funzioni virtuali private. Se è così, mi piacerebbe sicuramente vederlo.
I compilatori C ++ che uso sicuramente non permetteranno a un'implementazione di una classe derivata di chiamare un'implementazione di una classe base privata.
Se il comitato C ++ rilassasse il "privato" per consentire questo accesso specifico, sarei tutto per funzioni virtuali private. Allo stato attuale, ci viene ancora consigliato di chiudere a chiave la porta della stalla dopo che il cavallo è stato rubato.