Hãy xem xét đoạn mã sau: class A { protected; int a,b; public: float F1,F2; }; class B:public A { } Hỏi: B sử dụng được các biến thành viên nào của A
A.
a, b, F1, F2
B.
F1, F2
C.
a, b
D.
Không sử dụng được biến thành viên nào
Đáp án
Trong C++, khi một lớp (class) kế thừa từ một lớp khác, nó sẽ được thừa hưởng các thành viên (biến và phương thức) của lớp cha. Tuy nhiên, quyền truy cập của các thành viên này phụ thuộc vào từ khóa chỉ định phạm vi (access specifier) của chúng trong lớp cha và kiểu kế thừa được sử dụng. Trong trường hợp này, lớp `B` kế thừa từ lớp `A` theo kiểu `public`.
* **public:** Các thành viên `public` của lớp `A` (F1 và F2) sẽ vẫn là `public` trong lớp `B`. Do đó, chúng có thể được truy cập từ bất kỳ đâu.
* **protected:** Các thành viên `protected` của lớp `A` (a và b) sẽ trở thành `protected` trong lớp `B`. Điều này có nghĩa là chúng có thể được truy cập từ bên trong lớp `B`, từ các lớp kế thừa từ `B`, và từ các lớp bạn (friend classes) của `B`. Tuy nhiên, chúng không thể được truy cập trực tiếp từ bên ngoài lớp `B`.
Vì vậy, lớp `B` có thể sử dụng các biến thành viên `F1` và `F2` (do chúng là `public` trong lớp `A`) và `a` và `b` (do chúng là `protected` trong lớp `A` và `B` kế thừa `A`).
Trong C++, khi một lớp (class) kế thừa từ một lớp khác, nó sẽ được thừa hưởng các thành viên (biến và phương thức) của lớp cha. Tuy nhiên, quyền truy cập của các thành viên này phụ thuộc vào từ khóa chỉ định phạm vi (access specifier) của chúng trong lớp cha và kiểu kế thừa được sử dụng. Trong trường hợp này, lớp `B` kế thừa từ lớp `A` theo kiểu `public`.
* **public:** Các thành viên `public` của lớp `A` (F1 và F2) sẽ vẫn là `public` trong lớp `B`. Do đó, chúng có thể được truy cập từ bất kỳ đâu.
* **protected:** Các thành viên `protected` của lớp `A` (a và b) sẽ trở thành `protected` trong lớp `B`. Điều này có nghĩa là chúng có thể được truy cập từ bên trong lớp `B`, từ các lớp kế thừa từ `B`, và từ các lớp bạn (friend classes) của `B`. Tuy nhiên, chúng không thể được truy cập trực tiếp từ bên ngoài lớp `B`.
Vì vậy, lớp `B` có thể sử dụng các biến thành viên `F1` và `F2` (do chúng là `public` trong lớp `A`) và `a` và `b` (do chúng là `protected` trong lớp `A` và `B` kế thừa `A`).
Lớp `Lop2` được khai báo là `friend class` của lớp `Lop1`. Điều này có nghĩa là lớp `Lop2` có quyền truy cập vào tất cả các thành viên của lớp `Lop1`, kể cả các thành viên `private` và `protected`. Do đó, đối tượng `objA` (thuộc lớp `Lop2`) có thể truy cập vào tất cả các biến `a`, `b`, `x`, và `y` của đối tượng thuộc lớp `Lop1`.
Mặt khác, lớp `Lop3` không phải là `friend class` của lớp `Lop1`. Vì vậy, đối tượng `objB` (thuộc lớp `Lop3`) chỉ có thể truy cập vào các thành viên `public` của lớp `Lop1`, tức là các biến `x` và `y`.
Vậy, đáp án đúng là: objA truy cập được tất cả các biến, objB truy cập được các biến x, y.
Lớp `Lop2` kế thừa từ lớp `Lop1` thông qua `public inheritance`. Điều này có nghĩa là tất cả các thành viên `public` của `Lop1` cũng sẽ trở thành các thành viên `public` của `Lop2`. Do đó, đối tượng `objLop2` của `Lop2` có thể trực tiếp truy cập các thành viên `public` của `Lop1`, bao gồm cả hàm `nhap()`. Ngoài ra, `Lop2` còn chứa một đối tượng `p` thuộc lớp `Lop1`. Để truy cập hàm `nhap()` thông qua đối tượng `p`, chúng ta sử dụng cú pháp `objLop2.p.nhap()`. Vì vậy, đáp án B là chính xác nhất vì nó trực tiếp gọi hàm `nhap()` từ đối tượng `objLop2` đã kế thừa từ lớp `Lop1`.
Trong lập trình hướng đối tượng, từ khóa `protected` được sử dụng để khai báo các thành viên (biến hoặc phương thức) của một lớp có thể truy cập từ bên trong lớp đó, từ các lớp con (lớp kế thừa) và từ các lớp trong cùng một package. Điều này khác với `private` (chỉ truy cập được từ bên trong lớp) và `public` (truy cập được từ mọi nơi).
* **Phương án A:** Không chính xác vì protected cho phép truy cập chứ không chỉ thừa kế.
* **Phương án B:** Đây là ý nghĩa chính xác của protected, các thành viên được bảo vệ.
* **Phương án C:** Sai. Các thành viên private mới được dùng riêng.
* **Phương án D:** Sai. Các thành viên public mới được dùng chung, protected thì bị giới hạn hơn.
Vậy đáp án đúng là B.
Sau khi khai báo và xây dựng thành công lớp đối tượng Sinh viên, lớp này được xem như một khuôn mẫu để tạo ra các đối tượng Sinh viên cụ thể. Trong lập trình hướng đối tượng, một lớp (class) định nghĩa một kiểu dữ liệu trừu tượng (Abstract Data Type - ADT). ADT bao gồm các thuộc tính (dữ liệu) và các phương thức (hành vi) mà các đối tượng của lớp đó sẽ có. Vì vậy, đáp án B là chính xác nhất.