Trotz aller Aufrufe, ein virtuelles Mitglied für privat zu erklären, hält das Argument einfach kein Wasser. Häufig muss die Überschreibung einer virtuellen Funktion durch eine abgeleitete Klasse die Basisklassenversion aufrufen. Es kann nicht, wenn es deklariert ist 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) {}
};
Sie haben die Basisklassenmethode zu erklären protected
.
Dann müssen Sie das hässliche Mittel nehmen, über einen Kommentar anzuzeigen, dass die Methode überschrieben, aber nicht aufgerufen werden soll.
class Base
{
...
protected:
// chained virtual function!
// call in your derived version but nowhere else.
// Use set_data instead
virtual void cleanup() { /* do something */ }
...
Also Herb Sutters Richtlinie Nr. 3 ... Aber das Pferd ist trotzdem aus dem Stall.
Wenn Sie etwas deklarieren, dem protected
Sie implizit vertrauen, dass der Verfasser einer abgeleiteten Klasse die geschützten Interna versteht und ordnungsgemäß verwendet, friend
impliziert eine Deklaration ein tieferes Vertrauen für die private
Mitglieder.
Benutzer, die sich schlecht verhalten, wenn sie dieses Vertrauen verletzen (z. B. als "ahnungslos" bezeichnet, weil sie sich nicht die Mühe machen, Ihre Dokumentation zu lesen), sind selbst schuld.
Update : Ich habe einige Rückmeldungen erhalten, die besagen, dass Sie Implementierungen virtueller Funktionen auf diese Weise mithilfe privater virtueller Funktionen "verketten" können. Wenn ja, würde ich es gerne sehen.
Die von mir verwendeten C ++ - Compiler lassen eine abgeleitete Klassenimplementierung definitiv keine private Basisklassenimplementierung aufrufen.
Wenn das C ++ - Komitee "privat" lockern würde, um diesen spezifischen Zugriff zu ermöglichen, wäre ich alles für private virtuelle Funktionen. So wie es aussieht, wird uns immer noch geraten, das Scheunentor zu verschließen, nachdem das Pferd gestohlen wurde.