W poniższym przykładzie dlaczego nazwa B::f()
jest wywoływana, mimo że jest prywatna?Członek funkcji prywatnej o nazwie spoza klasy
Znam ten fakt: Dostęp jest sprawdzany w punkcie wywołania przy użyciu typu wyrażenia używanego do oznaczenia obiektu, dla którego wywołana jest funkcja składowa.
#include <iostream>
class A {
public:
virtual void f() { std::cout << "virtual_function"; }
};
class B : public A {
private:
void f() { std::cout << "private_function"; }
};
void C(A &g) { g.f(); }
int main() {
B b;
C(b);
}
Bo to jest publiczne w A, przypuszczalnie z powodu faktu, że A jest rodzicem i używasz go z obiektu nie przeszkadza sprawdzenie zakresu na dziecko, to jest po prostu zastąpione przez fakt, że jest publiczna w A. Tylko moje myśli. – tom
To, co powiedziałeś, wyjaśnia to - statyczny typ 'g' w' C' to 'A &', a 'f()' jest publiczną funkcją składową 'A'. Na tym właśnie polega kontrola dostępu. Zmień typ parametru "C()" na "B &", a Twój kod się nie skompiluje. – Praetorian