Trong ví dụ bên dưới, tại sao B::f()
được gọi là mặc dù nó là riêng tư?Thành viên chức năng riêng được gọi ngoài lớp
Tôi biết thực tế này: Quyền truy cập được chọn tại điểm gọi sử dụng loại biểu thức được sử dụng để biểu thị đối tượng mà hàm thành viên được gọi.
#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);
}
Bởi vì nó là công khai trong A, có lẽ và do thực tế rằng A là một phụ huynh và bạn đang sử dụng nó từ một đối tượng A nó không bận tâm kiểm tra phạm vi trên đứa trẻ, nó chỉ bị ghi đè bởi thực tế là nó là công khai trong A. Chỉ là suy nghĩ của tôi. – tom
Những gì bạn đã giải thích nó - kiểu tĩnh của 'g' trong' C' là 'A &', và 'f()' là một hàm thành viên công khai của 'A'. Đó là tất cả các điều khiển truy cập quan tâm. Thay đổi kiểu tham số 'C()' thành 'B &' và mã của bạn sẽ không biên dịch được. – Praetorian