JavaScript is required

What is wrong in the following code? #include using namespace std; class Base { public: virtual void Method() = 0 { n = 1; } private: int n; }; class D1 :Base {}; class D2 :public D1 { int i; void Method() { i = 2; } }; int main() { D2 test; return 0; }

A.

There is no error

B.

There is a syntax error in the declaration of “Method”

C.

Class D2 does not have access to “Method”

D.

Class D1 must define “Method”

Trả lời:

Đáp án đúng: A


Đoạn code C++ có một số vấn đề. Lớp `Base` định nghĩa một phương thức ảo thuần túy `Method` bằng `= 0`. Điều này có nghĩa là `Base` là một lớp trừu tượng (abstract class). Một lớp trừu tượng không thể được khởi tạo trực tiếp, và bất kỳ lớp con nào của nó phải cung cấp một định nghĩa cho tất cả các phương thức ảo thuần túy của nó, nếu không lớp con đó cũng sẽ là một lớp trừu tượng. Trong trường hợp này: - Lớp `D1` kế thừa từ `Base`, nhưng không định nghĩa lại phương thức `Method`. Do đó, `D1` cũng là một lớp trừu tượng. - Lớp `D2` kế thừa từ `D1`, và *có* định nghĩa lại phương thức `Method`. Tuy nhiên, lớp `D2` định nghĩa lại `Method` ở chế độ `private`, điều này khiến nó không thể được gọi từ bên ngoài lớp `D2` (nhưng vẫn thỏa mãn yêu cầu phải định nghĩa lại `Method` để không còn là abstract class nữa). Mấu chốt của vấn đề là lớp `D1` phải định nghĩa lại phương thức `Method` (hoặc làm cho `D1` trở thành abstract class một cách tường minh nếu không muốn định nghĩa lại, nhưng trong trường hợp này thì `D2` vẫn phải định nghĩa lại). Vậy đáp án đúng là: D. Class D1 must define “Method”

Câu hỏi liên quan