Prima di tutto, il tuo Derived::fun()
è anche virtual
, perché se una funzione in una classe derivata ha la stessa dichiarazione di una funzione virtuale nella classe base, la funzione nella classe derivata ottiene automaticamente virtual
, anche se questo non era esplicitamente specificato.
In secondo luogo, è completamente OK accedere alle funzioni virtuali private tramite funzioni intermedie pubbliche dalla classe base, vedere, ad esempio, this answer e i relativi collegamenti, in particolare Virtuality by Herb Sutter. Un codice di esempio potrebbe essere come
#include<iostream>
using namespace std;
class Derived;
class Base {
private:
virtual void fun() { cout << "Base Fun"; }
public:
void funInt() { fun(); }
};
class Derived: public Base {
private:
virtual void fun() { cout << "Derived Fun"; }
};
int main()
{
Base *ptr = new Derived;
ptr->funInt();
return 0;
}
Allora, che cosa succede nel tuo caso, credo, è una situazione simile: il main
è autorizzato ad accedere ptr->fun()
, ma a causa di questo virtualità fun()
sembra essere Derived::fun()
.
UPD: espansione su un commento
Ma non lo fa questo suono un po 'allarmante ..Voglio dire, tutte le funzioni che derivano dalla classe base, avranno i loro membri privati accessibile all'amico funzioni della classe base
No, non tutte le funzioni del Derived
saranno accessibili agli amici di Base
, ma solo quelli che possono essere accessibili tramite il puntatore Base
. Ad esempio:
class Base {
virtual void fun();
friend int main();
}
class Derived: public Base {
virtual void fun();
virtual void foo();
void bar();
}
solo Derived::fun()
è accessibile dalla principale:
int main() {
Derived *ptr = new Derived;
Base* baseptr = ptr;
baseptr->fun(); // ok, calls Derived::fun()
baseptr->foo(); // error, no such function in Base
ptr->foo(); // error, foo is private
return 0;
}
noti che virtual
funzione sono intenzionalmente estensibile e ogni override virtual
funzione Derived
significa che tale funzione può essere chiamata tramite Base
puntatore; questo è lo scopo principale delle funzioni virtual
. Se Derived
ha la sua funzione di override private
, è comunque necessario tenere presente che è possibile accedere alla funzione tramite il puntatore Base
, poiché questa è l'idea principale dietro le funzioni virtual
.
Gli amici hanno accesso ai membri privati. Dichiari il principale come amico, quindi c'è l'accesso ai membri privati. (perché hai fatto questo è un miracolo per me) – user463035818
@ tobi303, l'amico ha accesso al privato di 'Base' non' Derived' e il 'fun()' che viene chiamato quando il programma viene eseguito è 'fun()' del 'Derived' class .. BTW stavo giocando con i concetti C++, quindi ho trovato questo .. niente di pratico .. – Haris