Próbowałem dowiedzieć się, co się dzieje, gdy klasa pochodna deklaruje funkcję wirtualną jako prywatną. Poniżej znajduje się program, który napisałemPubliczna funkcja wirtualna pochodna prywatna w C++
#include <iostream>
using namespace std;
class A
{
public:
virtual void func() {
cout<<"A::func called"<<endl;
}
private:
};
class B:public A
{
public:
B()
{
cout<<"B constructor called"<<endl;
}
private:
void func() {
cout<<"B::func called"<<endl;
}
};
int main()
{
A *a = new B();
a->func();
return 0;
}
Zaskakująco (dla mnie) było wyjście:
B constructor called
B::func called
nie jest to naruszenie prywatny zestaw dostęp do tej funkcji. Czy to oczekiwane zachowanie? Czy jest to standardowe obejście lub luka? Czy poziomy dostępu są pomijane podczas rozwiązywania wywołań funkcji przez VTABLE?
Każdy wgląd w to zachowanie byłby bardzo pomocny.
Ponadto wspomniano, że prywatne przejęcie wirtualnego członka uniemożliwiłoby dalsze klasy dziedziczenie go. Nawet to ma problemy. Modyfikacja powyższego programu obejmują:
class C: public B
{
public:
void func() {
cout<<"C::func called"<<endl;
}
};
i główny program testowy do:
int main()
{
A *a = new C();
a->func();
return 0;
}
wyjście jest:
C::func called
Chciałem tylko wskazać, że jeden * nie może * zrobić tego w Javie. Gdy metoda jest nadpisywana, musi mieć poziom dostępu równy lub bardziej publiczny niż metoda, która jest nadpisywana. Powodem jest to, że musisz upewnić się, że wersja metody klasy podklasy może być wywołana ze wszystkich kontekstów, z których można wywołać wersję nadklasy. Uważam, że jest to interesujące w C++. – Tom
No cóż, mówią, że C++ pozwala ci się powiesić, jeśli się na to pochylisz. – Naveen