terminé de codificación (Con un poco de ayuda) algo como esto ayer:¿Cómo y por qué es posible cambiar el nivel de acceso de un miembro?
#include <iostream>
using namespace std;
class A
{
public:
virtual void foo(){cout << "A::foo\n";}
};
class B : private A
{
private:
virtual void foo(){ cout << "B::foo\n";}
void DoSomething(SomeOtherClass& o){o.DoSomething(*static_cast<A*>(this));}
};
He intentado cambiar el método de la herencia:
class B : public A
{
private:
virtual void foo(){ cout << "B::foo\n";}
};
int main()
{
A* a = new B;
a->foo();
}
Esto todavía funciona. Esperaba un error de tiempo de compilación. Por favor, dime por qué es posible y cuáles son los posibles usos. Conozco un uso debido al primer escenario: puede exponer diferentes interfaces para diferentes clases.
EDIT:
En el segundo caso, la salida se B::foo
.
¿Dónde esperabas el error?En la declaración de la función como privada? ¿O en la llamada de la función? –
Estoy intrigado. Esperando una respuesta que explique los posibles usos de esta característica (?). Un uso podría ser forzar al programador a crear una instancia de la clase B como un puntero a la clase base A para usar su interfaz. Pero por qué eso sería A Good Thing, no sé. – manneorama
@PigBen: esperaba el error en la definición de 'foo' en' B' en el segundo caso. – nakiya