JavaScript is required

What is wrong in the following code? #include class Base { public: Base() {}; virtual ~Base() {}; }; class Derived : protected Base { public: virtual ~Derived() {}; }; int main() { Base *pb = new Derived(); return 0; }

A.

There is nothing wrong

B.

One cannot have a ‘Base’ pointer to ‘Derived’ since it is not derived publicly

C.

One need a derived class pointer to point to a derived class

D.

One required to code a constructor for Derived

Trả lời:

Đáp án đúng: B


Đoạn mã có lỗi vì `Derived` kế thừa `Base` ở chế độ `protected`. Điều này có nghĩa là, từ bên ngoài lớp `Derived`, không thể coi `Derived` là một loại `Base` công khai. Do đó, việc gán một con trỏ kiểu `Base*` cho một đối tượng `Derived` được tạo bằng `new Derived()` sẽ gây ra lỗi biên dịch, vì nó vi phạm quy tắc truy cập kế thừa protected. Phương án A sai vì có lỗi trong code. Phương án B đúng vì giải thích chính xác lỗi, không thể tạo một con trỏ `Base` tới `Derived` vì nó không được kế thừa công khai. Phương án C sai vì ta hoàn toàn có thể dùng con trỏ lớp cha để trỏ tới đối tượng lớp con nếu lớp con được kế thừa từ lớp cha theo chế độ public. Phương án D sai vì không bắt buộc phải có constructor cho Derived, vì nếu không có constructor nào được định nghĩa thì trình biên dịch sẽ tự tạo ra một default constructor.

Câu hỏi liên quan