Przede wszystkim, Derived::fun()
jest również virtual
, bo jeśli funkcja w klasie pochodnej ma taką samą deklarację jako funkcję wirtualną w klasie bazowej, funkcja w klasie pochodnej automatycznie pobiera virtual
, nawet jeśli nie było wyraźnie określony.
Po drugie, dostęp do prywatnych funkcji wirtualnych za pośrednictwem publicznych pośrednich funkcji klasy podstawowej jest całkowicie OK, patrz na przykład this answer i jego linki, w szczególności Virtuality by Herb Sutter. Próbkę kodu może być jak
#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;
}
Więc, co dzieje się w twoim przypadku, myślę, że jest podobna sytuację: main
ma dostępu do ptr->fun()
, ale ze względu na wirtualności tego fun()
bywa Derived::fun()
.
UPD: rozszerzenie na komentarzu
ale nie brzmi to trochę niepokojącą ..To znaczy, wszystkie funkcje że wywodzą się z klasy bazowej, będzie miał ich prywatnymi członków dostęp do funkcji przyjaciel klasie Base
Nie, nie wszystkie funkcje Derived
będą dostępne dla przyjaciół Base
, ale tylko te, które mogą być dostępne za pośrednictwem wskaźnika Base
. Na przykład:
class Base {
virtual void fun();
friend int main();
}
class Derived: public Base {
virtual void fun();
virtual void foo();
void bar();
}
Derived::fun()
można uzyskać tylko od głównej:
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;
}
Zauważ, że virtual
funkcja są celowo rozszerzalny, a wszelkie ominięcie virtual
funkcji w Derived
oznacza, że funkcja ta może być wywołana poprzez Base
wskaźnik; to jest główny cel funkcji virtual
. Jeśli Derived
tworzy funkcję nadrzędną private
, nadal powinno być świadome, że funkcja jest dostępna za pośrednictwem wskaźnika Base
, ponieważ jest to główny pomysł funkcji virtual
.
znajomi mają dostęp do prywatnych członków. Deklarujesz głównego jako przyjaciela, więc masz dostęp do prywatnych członków. (dlaczego zrobiłeś to dla mnie cudem) – user463035818
@ tobi303, znajomy ma dostęp do prywatnego zbioru 'Base', a nie' Derived' i 'fun()' podczas wywoływania programu jest 'fun()' z 'Derived' class .. BTW grałem z koncepcjami C++, więc natknąłem się na to .. nic praktycznego .. – Haris