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, protected
ti fidi implicitamente dello scrittore di qualsiasi classe derivata per comprendere e utilizzare correttamente le parti interne protette, proprio nel modo in cui una friend
dichiarazione implica una fiducia più profonda per i private
membri.
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.