CSE 428: Giải pháp bài tập về lập trình hướng đối tượng và C ++
SuperScript "[d]" là viết tắt của "khó khăn". Các bài tập tương tự như các bài tập được đánh dấu bằng "[d]" có thể xuất hiện trong các kỳ thi ứng cử, nhưng không phải trong các bài kiểm tra tiêu chuẩn của CSE 428.[d]" stands for "difficult". Exercises similar to those marked with "[d]" might appear in candidacy exams, but not in the standard exams of CSE 428.
- Xem xét các khai báo lớp sau trong C ++:
class C { protected: int x; public: void f[]{...}; }; class C1: public C { protected: int x1; public: void h[C *obj]{...}; }; class C2: public C1 { public: int x2; }; class C3: public C { public: f[]{...}; };
- Vẽ phân cấp lớp
- Giả sử rằng chính chứa các tuyên bố sau:
C1 obj1;
cho mỗi biểu thức sau đây, hãy nói liệu nó có được phép trong mã chính hay không [chúng có thể bị cấm vì chúng vi phạm định nghĩa lớp hoặc cơ chế bảo vệ]obj1.x , obj1.f[] , obj1.x1 , obj1.x2
- . Assume that the body of C1::h contains the following declarations
C2 *obj2; C3 *obj3;
For each of the following expressions, say whether it is allowed in the body of C1::h or notobj->x , obj2->x , obj3->x
- Giả sử rằng phần thân của C1 :: H chứa câu lệnh sau
obj->f[];
Giả sử rằng chúng ta gọi C1 :: H với một tham số [trỏ đến một đối tượng] của lớp C3. Phương pháp F được thực hiện là gì, c :: f [] hoặc c3 :: f [] là gì? Và điều gì sẽ là phương thức được thực hiện nếu F được khai báo ảo trong C?
Dung dịch
- Phân cấp lớp được biểu thị bằng biểu đồ sau:
C / \ / \ C1 C3 | | C2
- OBJ1.x không được phép trong chính, vì X là trường được bảo vệ của C, do đó nó không thể truy cập bên ngoài.
- obj1.f [] được cho phép, vì f [] là một phương thức công khai được kế thừa bởi C1.
- OBJ1.x1 không được phép trong chính, vì X1 là trường được bảo vệ.
- OBJ1.x2 không được phép trong chính, vì x2 không phải là thành viên của C1.
- OBJ-> X không được phép trong C1 :: H, vì X là trường được bảo vệ của C. Cơ sở lý luận là OBJ có thể được thay thế, tại thời điểm chạy, bởi một đối tượng của một lớp con không ở cùng một nhánh của C1.
- obj2-> x trong C1 :: H được cho phép. Điều này có thể trông hơi lạ, đặc biệt là trái ngược với câu hỏi trước đó, nhưng là "Hướng dẫn tham khảo C ++ được chú thích" [theo Ellis và Stroustrup] quy định. Ý tưởng là các trường và phương thức được bảo vệ nên được áp dụng [tính bằng C1] cho các đối tượng là Guarranteed thuộc về các lớp trong cùng một nhánh của C1.
- OBJ3-> X không được phép trong C1 :: H, vì X là trường được bảo vệ của C, được kế thừa được bảo vệ bởi C3.
- Phương pháp được thực thi là c :: f []. Nếu C :: f [] được từ chối ảo, thì phương thức được thực thi sẽ là C3 :: f [].
Dưới đây là kết quả của việc biên dịch và thực thi bằng G ++
// FILE Exercise_1.C #include < iostream.h > class C { protected: int x; public: void f[]{ cout f[] from C1::h: executes C3::f[] */
template < class T > class cell { protected: T info; public: void set[T x]{ info = x; } T get[] { return info; } };Xác định lớp con colored_cell bằng cách mở rộng ô lớp với:
- một màu trường, biểu thị màu của ô, được biểu thị như một ký tự ["W" cho màu trắng, "B" cho màu đen, "r" cho màu đỏ, v.v.],
- Phương thức set_color, đặt nội dung của màu trường,
- phương thức get_color, trả về nội dung của màu trường và
- Một phương thức cập nhật nhận được, trả về nội dung của thông tin trường nếu màu không có màu trắng và trả về 0 nếu không.
Dung dịch
template < class T > class colored_cell: public cell< T >{ protected: char color; public: void set_color[char c]{ color = c; } char get_color[] { return color; } T get[] { if [color != 'w'] return info; else return 0; } };
C / \ / \ C1 C3 | | C2
Dung dịch
Phân cấp lớp được biểu thị bằng biểu đồ sau:C / \ / \ C1 C3 | | C2
Dung dịch
Phân cấp lớp được biểu thị bằng biểu đồ sau:C / \ / \ C1 C3 | | C2
C1 obj1;
3C1 obj1;
4- obj1.f [] được cho phép, vì f [] là một phương thức công khai được kế thừa bởi C1.
Dung dịch
- Phân cấp lớp được biểu thị bằng biểu đồ sau:
C / \ / \ C1 C3 | | C2
- OBJ1.x không được phép trong chính, vì X là trường được bảo vệ của C, do đó nó không thể truy cập bên ngoài.
- obj1.f [] được cho phép, vì f [] là một phương thức công khai được kế thừa bởi C1.