ho finito di codifica (con qualche aiuto) qualcosa di simile ieri:Come e perché è possibile modificare il livello di accesso di un membro?
#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));}
};
Ho provato a cambiare il metodo di eredità:
class B : public A
{
private:
virtual void foo(){ cout << "B::foo\n";}
};
int main()
{
A* a = new B;
a->foo();
}
Questo funziona ancora. Mi aspettavo un errore in fase di compilazione. Per favore dimmi perché questo è possibile e quali sono i possibili usi? Conosco un utilizzo a causa del primo scenario: puoi esporre interfacce diverse per classi diverse.
EDIT:
Nel secondo caso, l'uscita è B::foo
.
Dove ti aspettavi l'errore?Sulla dichiarazione della funzione come privata? O sulla chiamata della funzione? –
Sono incuriosito. Sperando in una risposta che spiegherebbe i possibili usi di questa funzionalità (?). Un utilizzo potrebbe essere quello di forzare il programmatore a creare un'istanza della classe B come puntatore alla classe base A per poter utilizzare la sua interfaccia. Ma perché sarebbe una buona cosa, non lo so. – manneorama
@PigBen: mi aspettavo che l'errore nella definizione di 'pippo' in' B' nel secondo caso. – nakiya