Cho đoạn chương trình như hình trên, lớp Convat được gọi là:

Trả lời:
Đáp án đúng: B
Đoạn chương trình cho thấy lớp `Convat` kế thừa từ lớp `Animal`. Trong lập trình hướng đối tượng, lớp kế thừa từ một lớp khác được gọi là lớp dẫn xuất (hay lớp con). Lớp `Animal` được gọi là lớp cơ sở (hay lớp cha).
Cùng ôn thi với bộ câu hỏi trắc nghiệm môn Lập trình hướng đối tượng có đáp án mà tracnghiem.net chia sẽ dưới đây, nhằm giúp các bạn sinh viên chuyên ngành chuẩn bị cho kì thi sắp tới.
50 câu hỏi 60 phút
Câu hỏi liên quan
Lời giải:
Đáp án đúng: A
Trong C++, từ khóa `virtual` được sử dụng để khai báo một phương thức ảo trong một lớp cơ sở (base class). Phương thức ảo cho phép các lớp kế thừa (derived classes) ghi đè (override) phương thức này và cung cấp một định nghĩa riêng phù hợp với lớp của chúng. Điều này cho phép tính đa hình (polymorphism), trong đó một đối tượng của lớp dẫn xuất có thể được xử lý như một đối tượng của lớp cơ sở, và phương thức ảo được gọi sẽ là phiên bản của lớp dẫn xuất.
- Đáp án A: Khai báo một phương thức ảo - Đúng, vì dòng `virtual void xungten()` chính xác là khai báo một phương thức ảo.
- Đáp án B: Khai báo một phương thức tĩnh - Sai, phương thức tĩnh được khai báo bằng từ khóa `static`.
- Đáp án C: Khai báo một phương thức riêng không cho phép kế thừa - Sai, phương thức riêng (private) không cho phép kế thừa, nhưng không liên quan đến từ khóa `virtual`.
- Đáp án D: Khai báo một phương thức bắt buộc phải có trong các lớp kế thừa - Sai, phương thức ảo không bắt buộc phải được ghi đè trong lớp kế thừa, trừ khi nó là một phương thức ảo thuần túy (pure virtual function) được khai báo bằng `= 0`.
- Đáp án A: Khai báo một phương thức ảo - Đúng, vì dòng `virtual void xungten()` chính xác là khai báo một phương thức ảo.
- Đáp án B: Khai báo một phương thức tĩnh - Sai, phương thức tĩnh được khai báo bằng từ khóa `static`.
- Đáp án C: Khai báo một phương thức riêng không cho phép kế thừa - Sai, phương thức riêng (private) không cho phép kế thừa, nhưng không liên quan đến từ khóa `virtual`.
- Đáp án D: Khai báo một phương thức bắt buộc phải có trong các lớp kế thừa - Sai, phương thức ảo không bắt buộc phải được ghi đè trong lớp kế thừa, trừ khi nó là một phương thức ảo thuần túy (pure virtual function) được khai báo bằng `= 0`.
Lời giải:
Đáp án đúng: B
Trong C++, lớp `Circle` kế thừa từ lớp `Point`. Nhận xét cho rằng chương trình bị lỗi tại dòng 6 do chưa khai báo `Point` là sai. `Point` đã được khai báo trong `diem.h` thông qua `#include "diem.h"` (dòng 4). Do đó, trình biên dịch đã biết đến `Point` khi định nghĩa `Circle`.
Lời giải:
Đáp án đúng: A
Đoạn code sử dụng tính kế thừa. Lớp `B` kế thừa từ lớp `A`.
1. Khởi tạo đối tượng `a`: `A a = new A(1);` Đối tượng `a` thuộc lớp `A` được tạo ra. Giá trị `x` của `a` được khởi tạo là 1.
2. Khởi tạo đối tượng `b`: `B b = new B(2);` Đối tượng `b` thuộc lớp `B` được tạo ra. Tham số `x = 2` được truyền vào constructor của `B`. Trong constructor của `B`, lệnh `super(x)` gọi constructor của lớp cha `A`, do đó giá trị `x` của lớp `A` sẽ là 2. Giá trị `y` của đối tượng `b` được khởi tạo là `x + 0.5 = 2 + 0.5 = 2.5`.
3. Gán `a = b`: `a = b;` `a` bây giờ tham chiếu đến đối tượng `b`. Lưu ý rằng `a` vẫn là một biến kiểu `A`, nhưng nó đang trỏ đến một đối tượng kiểu `B`.
4. In `a.x` và `((B) a).y`:
* `a.x`: Vì `a` là kiểu `A` và đang trỏ đến một đối tượng của `B` (đã được gán `a = b`), và lớp `B` không ghi đè thuộc tính `x` của lớp `A`, nên khi gọi `a.x`, nó sẽ sử dụng `x` của lớp `A`. Vì constructor của `A` đã được gọi với `x = 2` (qua lời gọi `super(x)` từ constructor của `B`), giá trị của `a.x` là 2. Tuy nhiên, khi tạo đối tượng `B`, constructor của lớp A được gọi trước nên `x = 2`, sau đó gọi `showX()` ghi đè lại giá trị `x= x/2.0 = 2/2.0 = 1.0`. Vậy `a.x = 1.0 + 0.5 = 1.5`
* `((B) a).y`: Ép kiểu `a` về kiểu `B` cho phép truy cập thuộc tính `y` của lớp `B`. Giá trị của `y` đã được khởi tạo là 2.5.
Vậy, kết quả in ra là `x = 1.5` và `y = 2.5`.
1. Khởi tạo đối tượng `a`: `A a = new A(1);` Đối tượng `a` thuộc lớp `A` được tạo ra. Giá trị `x` của `a` được khởi tạo là 1.
2. Khởi tạo đối tượng `b`: `B b = new B(2);` Đối tượng `b` thuộc lớp `B` được tạo ra. Tham số `x = 2` được truyền vào constructor của `B`. Trong constructor của `B`, lệnh `super(x)` gọi constructor của lớp cha `A`, do đó giá trị `x` của lớp `A` sẽ là 2. Giá trị `y` của đối tượng `b` được khởi tạo là `x + 0.5 = 2 + 0.5 = 2.5`.
3. Gán `a = b`: `a = b;` `a` bây giờ tham chiếu đến đối tượng `b`. Lưu ý rằng `a` vẫn là một biến kiểu `A`, nhưng nó đang trỏ đến một đối tượng kiểu `B`.
4. In `a.x` và `((B) a).y`:
* `a.x`: Vì `a` là kiểu `A` và đang trỏ đến một đối tượng của `B` (đã được gán `a = b`), và lớp `B` không ghi đè thuộc tính `x` của lớp `A`, nên khi gọi `a.x`, nó sẽ sử dụng `x` của lớp `A`. Vì constructor của `A` đã được gọi với `x = 2` (qua lời gọi `super(x)` từ constructor của `B`), giá trị của `a.x` là 2. Tuy nhiên, khi tạo đối tượng `B`, constructor của lớp A được gọi trước nên `x = 2`, sau đó gọi `showX()` ghi đè lại giá trị `x= x/2.0 = 2/2.0 = 1.0`. Vậy `a.x = 1.0 + 0.5 = 1.5`
* `((B) a).y`: Ép kiểu `a` về kiểu `B` cho phép truy cập thuộc tính `y` của lớp `B`. Giá trị của `y` đã được khởi tạo là 2.5.
Vậy, kết quả in ra là `x = 1.5` và `y = 2.5`.
Lời giải:
Đáp án đúng: A
Trong đa năng hóa toán tử nhập (istream), chúng ta cần một hàm `friend` để có thể truy cập các thành viên private của lớp `SP`. Hàm này phải trả về một tham chiếu đến `istream` để có thể thực hiện nhập liên tiếp (ví dụ: `cin >> a >> b`). Tham số đầu tiên là một tham chiếu đến `istream` (để nhận dữ liệu nhập), và tham số thứ hai là một tham chiếu đến đối tượng `SP` (để lưu trữ dữ liệu nhập).
* A. friend istream & operator >>(istream & istr, SP &a);
Đây là khai báo đúng. Hàm `friend` trả về một tham chiếu đến `istream`, nhận một tham chiếu đến `istream` và một tham chiếu đến đối tượng `SP`.
* B. friend void istream & operator >>(istream & istr, SP &a);
Sai vì hàm này khai báo trả về kiểu `void istream &`, điều này không hợp lệ. Toán tử nhập phải trả về tham chiếu đến `istream` để cho phép nhập liên tiếp.
* C. friend istream & operator >>(istream istr, SP &a);
Sai vì tham số `istream istr` không phải là một tham chiếu. Khi đó, `istr` chỉ là bản sao của luồng nhập, và mọi thay đổi trên `istr` không ảnh hưởng đến luồng nhập gốc, làm cho việc nhập dữ liệu không có ý nghĩa.
* D. friend istream & operator >>(istream & istr, SP a);
Sai vì tham số `SP a` không phải là một tham chiếu. Điều này có nghĩa là `a` là một bản sao của đối tượng `SP` gốc. Bất kỳ thay đổi nào đối với `a` trong hàm sẽ không ảnh hưởng đến đối tượng `SP` gốc mà chúng ta muốn nhập dữ liệu vào.
Vậy, đáp án đúng là A.
* A. friend istream & operator >>(istream & istr, SP &a);
Đây là khai báo đúng. Hàm `friend` trả về một tham chiếu đến `istream`, nhận một tham chiếu đến `istream` và một tham chiếu đến đối tượng `SP`.
* B. friend void istream & operator >>(istream & istr, SP &a);
Sai vì hàm này khai báo trả về kiểu `void istream &`, điều này không hợp lệ. Toán tử nhập phải trả về tham chiếu đến `istream` để cho phép nhập liên tiếp.
* C. friend istream & operator >>(istream istr, SP &a);
Sai vì tham số `istream istr` không phải là một tham chiếu. Khi đó, `istr` chỉ là bản sao của luồng nhập, và mọi thay đổi trên `istr` không ảnh hưởng đến luồng nhập gốc, làm cho việc nhập dữ liệu không có ý nghĩa.
* D. friend istream & operator >>(istream & istr, SP a);
Sai vì tham số `SP a` không phải là một tham chiếu. Điều này có nghĩa là `a` là một bản sao của đối tượng `SP` gốc. Bất kỳ thay đổi nào đối với `a` trong hàm sẽ không ảnh hưởng đến đối tượng `SP` gốc mà chúng ta muốn nhập dữ liệu vào.
Vậy, đáp án đúng là A.
Lời giải:
Đáp án đúng: A
Lớp `Ds_thi_sinh` chứa một con trỏ `ds` kiểu `Thi_sinh *` và một biến `sothisinh` kiểu `int`. Điều này có nghĩa là lớp `Ds_thi_sinh` sử dụng lớp `Thi_sinh` như một thành phần để lưu trữ thông tin về các thí sinh. Do đó, lớp `Thi_sinh` là lớp thành phần của lớp `Ds_thi_sinh`.
Các phương án khác không đúng vì:
- Lớp `Thi_sinh` không phải là lớp bao của lớp `Ds_thi_sinh` vì lớp `Ds_thi_sinh` chứa một con trỏ đến đối tượng `Thi_sinh`, không phải ngược lại.
- Hai lớp có mối quan hệ đặc biệt: lớp `Ds_thi_sinh` sử dụng lớp `Thi_sinh` như một thành phần.
- Lớp `Thi_sinh` không phải là lớp con của lớp `Ds_thi_sinh` vì không có quan hệ kế thừa nào ở đây.
Các phương án khác không đúng vì:
- Lớp `Thi_sinh` không phải là lớp bao của lớp `Ds_thi_sinh` vì lớp `Ds_thi_sinh` chứa một con trỏ đến đối tượng `Thi_sinh`, không phải ngược lại.
- Hai lớp có mối quan hệ đặc biệt: lớp `Ds_thi_sinh` sử dụng lớp `Thi_sinh` như một thành phần.
- Lớp `Thi_sinh` không phải là lớp con của lớp `Ds_thi_sinh` vì không có quan hệ kế thừa nào ở đây.
Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP
Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP
Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP
Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP
Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP

FORM.08: Bộ 130+ Biểu Mẫu Thống Kê Trong Doanh Nghiệp
136 tài liệu563 lượt tải

FORM.07: Bộ 125+ Biểu Mẫu Báo Cáo Trong Doanh Nghiệp
125 tài liệu585 lượt tải

FORM.06: Bộ 320+ Biểu Mẫu Hành Chính Thông Dụng
325 tài liệu608 lượt tải

FORM.05: Bộ 330+ Biểu Mẫu Thuế - Kê Khai Thuế Mới Nhất
331 tài liệu1010 lượt tải

FORM.04: Bộ 240+ Biểu Mẫu Chứng Từ Kế Toán Thông Dụng
246 tài liệu802 lượt tải

CEO.22: Bộ Tài Liệu Quy Trình Kiểm Toán, Kiểm Soát Nội Bộ Doanh Nghiệp
138 tài liệu417 lượt tải
ĐĂNG KÝ GÓI THI VIP
- Truy cập hơn 100K đề thi thử và chính thức các năm
- 2M câu hỏi theo các mức độ: Nhận biết – Thông hiểu – Vận dụng
- Học nhanh với 10K Flashcard Tiếng Anh theo bộ sách và chủ đề
- Đầy đủ: Mầm non – Phổ thông (K12) – Đại học – Người đi làm
- Tải toàn bộ tài liệu trên TaiLieu.VN
- Loại bỏ quảng cáo để tăng khả năng tập trung ôn luyện
- Tặng 15 ngày khi đăng ký gói 3 tháng, 30 ngày với gói 6 tháng và 60 ngày với gói 12 tháng.
77.000 đ/ tháng