A pesar de todas las llamadas para declarar privado a un miembro virtual, el argumento simplemente no aguanta. Con frecuencia, la anulación de una función virtual de una clase derivada tendrá que llamar a la versión de la clase base. No puede si se declara 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) {}
};
Usted tiene que declarar el método de la clase base protected
.
Luego, debe tomar el desagradable recurso de indicar mediante un comentario que el método debe ser anulado pero no llamado.
class Base
{
...
protected:
// chained virtual function!
// call in your derived version but nowhere else.
// Use set_data instead
virtual void cleanup() { /* do something */ }
...
Así, la guía # 3 de Herb Sutter ... Pero el caballo está fuera del granero de todos modos.
Cuando declaras algo protected
, confías implícitamente en el escritor de cualquier clase derivada para que comprenda y use adecuadamente las partes internas protegidas, tal como una friend
declaración implica una confianza más profunda para los private
miembros.
Los usuarios que tienen un mal comportamiento al violar esa confianza (por ejemplo, etiquetados como 'despistados' al no molestarse en leer su documentación) solo tienen la culpa.
Actualización : He recibido algunos comentarios que afirman que puede "encadenar" implementaciones de funciones virtuales de esta manera utilizando funciones virtuales privadas. Si es así, me gustaría verlo.
Los compiladores de C ++ que uso definitivamente no permitirán que una implementación de clase derivada llame a una implementación de clase base privada.
Si el comité de C ++ se relajara "privado" para permitir este acceso específico, estaría todo para funciones virtuales privadas. Tal como están las cosas, todavía se nos aconseja cerrar la puerta del establo después de que el caballo sea robado.