In the following code, which of the following variables can be accessed in “Friend”? class Base { public: int a; protected: int b; private: int c; }; class Derived : Base { int d; friend Friend; }; class Friend { Derived derived; };
Trả lời:
Đáp án đúng: D
Trong C++, một lớp (class) được khai báo là `friend` của một lớp khác, nó có quyền truy cập vào tất cả các thành viên của lớp kia, bất kể chúng được khai báo là `public`, `protected` hay `private`. Trong đoạn mã trên, `Friend` được khai báo là `friend` của `Derived`. Do đó, `Friend` có thể truy cập vào tất cả các thành viên của `Derived`, kể cả các thành viên kế thừa từ `Base`.
Các thành viên của `Base` bao gồm:
- `a` (public): Có thể truy cập từ bất cứ đâu.
- `b` (protected): Có thể truy cập từ các lớp con và các lớp `friend`.
- `c` (private): Chỉ có thể truy cập từ bên trong lớp `Base`.
Vì `Friend` là `friend` của `Derived`, và `Derived` kế thừa từ `Base`, `Friend` có thể truy cập `a` và `b` của `Base` thông qua một đối tượng `Derived`. Tuy nhiên, `Friend` không thể trực tiếp truy cập `c` vì `c` là `private` trong `Base`, và chỉ có các thành viên của `Base` mới có quyền truy cập.
Ngoài ra, `Friend` có thể truy cập `d`, là một thành viên của `Derived`.
Như vậy, `Friend` có thể truy cập `a` và `b` thông qua đối tượng `derived` của lớp `Derived`.
Vì vậy, đáp án đúng là A.