Pomimo wszystkich wezwań do ogłoszenia wirtualnego członka jako prywatnego, argument po prostu nie wytrzymuje. Często przesłonięcie funkcji wirtualnej przez klasę pochodną będzie musiało wywołać wersję klasy bazowej. Nie może, jeśli zostało zadeklarowane 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) {}
};
Ci mają zadeklarować metodę klasy bazowej protected
.
Następnie musisz zastosować brzydki cel wskazania za pomocą komentarza, że metoda powinna zostać zastąpiona, ale nie wywoływana.
class Base
{
...
protected:
// chained virtual function!
// call in your derived version but nowhere else.
// Use set_data instead
virtual void cleanup() { /* do something */ }
...
Tak więc wskazówka Herba Suttera nr 3 ... Ale koń i tak wyszedł ze stajni.
Kiedy deklarujesz coś, protected
co niejawnie ufasz autorowi dowolnej klasy pochodnej w zrozumieniu i prawidłowym używaniu chronionych elementów wewnętrznych, tak jak friend
deklaracja sugeruje głębsze zaufanie dla private
członków.
Użytkownicy, którzy mają złe zachowanie z powodu naruszenia tego zaufania (np. Oznaczeni jako „nieświadomi”, nie zawracając sobie głowy czytaniem dokumentacji), mogą winić tylko siebie.
Aktualizacja : Otrzymałem opinię, która twierdzi, że można w ten sposób „łączyć” implementacje funkcji wirtualnych za pomocą prywatnych funkcji wirtualnych. Jeśli tak, z pewnością chciałbym to zobaczyć.
Kompilatory C ++, których używam, zdecydowanie nie pozwolą implementacji klasy pochodnej na wywołanie prywatnej implementacji klasy bazowej.
Gdyby komisja C ++ zwolniła „prywatne”, aby zezwolić na ten konkretny dostęp, byłbym całkowicie zwolennikiem prywatnych funkcji wirtualnych. W obecnym stanie nadal radzi się, abyśmy zamknęli drzwi do stodoły po kradzieży konia.