A pesar de todas las llamadas para declarar privado a un miembro virtual, el argumento simplemente no se sostiene. Con frecuencia, la anulación de una clase derivada de una función virtual tendrá que llamar a la versión de clase base. Puede no si es declarado 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 a declarar el método de la clase base protected
.
Luego, tiene que tomar el feo 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 */ }
...
lo tanto de Herb Sutter directriz # 3 ... Pero el caballo está fuera del establo de todos modos.
Cuando se declara algo protected
que está implícitamente confiar en el escritor de cualquier clase derivada de entender y utilizar correctamente las partes internas protegidas, sólo la forma de una declaración friend
implica una confianza más profunda para private
miembros.
Los usuarios que obtienen un mal comportamiento por violar esa confianza (por ejemplo, etiquetados como "despistado" al no molestarse en leer su documentación) solo tienen ellos mismos la culpa.
Actualización: He recibido algunos comentarios que afirman que puede "encadenar" implementaciones de funciones virtuales de esta manera mediante el uso de 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 relajó "en 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 es robado.
Creo que la pregunta es al revés. La razón para hacer algo virtual es siempre la misma: permitir que las clases derivadas lo anulen. Entonces la pregunta debería ser: ¿cuál es la ventaja de hacer que un método virtual sea privado? A lo que la respuesta es: hacer que todo sea privado por defecto. :-) – ShreevatsaR
@ShreevatsaR Pero ni siquiera respondió su propia pregunta ...... – Spencer