Hướng dẫn c++ oop exercises and solutions pdf - c ++ oop bài tập và giải pháp pdf

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.


  1. 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(){...}; 
       }; 
    
    1. Vẽ phân cấp lớp
    2. 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 
      
    3. . 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 not
         obj->x , obj2->x , obj3->x 
      
    4. 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

    1. 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.
    2. 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.
  2. 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 << "executes C::f()" << '\n'; }
   virtual void g(){ cout << "executes C::g()" << '\n'; }
}; 

class C1: public C { 
protected: 
   int x1; 
public: 
   void h(C *); 
}; 

class C2: public C1 { 
public: 
   int x2; 
}; 

class C3: public C { 
protected: 
   int x3; 
public: 
   void f(){ cout << "executes C3::f()" << '\n'; }
   void g(){ cout << "executes C3::g()" << '\n'; }
}; 

void C1::h(C *obj){
   C2 *obj2 = new C2;
   C3 *obj3 = new C3;
   //obj->x = 0;
   obj2->x = 2;
   //obj3->x = 3;
   cout << "method obj->f() from C1::h: "; obj->f();
   cout << "method obj->g() from C1::h: "; obj->g();
   cout << "method obj3->f() from C1::h: "; obj3->f();
} 

void main(){     
   C1 obj1; 
   //obj1.x = 0;
   cout << "method obj1.f() from main: "; obj1.f(); 
   //obj1.x1 = 1;
   //obj1.x2 = 2;
   C3 o3;
   obj1.h(&o3);
}

/* Errors (before commenting the lines producing errors)
% g++ Exercise_1.C
Exercise_1.C: In method `void C1::h(class C *)':
Exercise_1.C:32: member `x' is a protected member of class `C'
Exercise_1.C:34: member `x' is protected
Exercise_1.C: In function `int main(...)':
Exercise_1.C:41: member `x' is protected
Exercise_1.C:43: member `x1' is a protected member of class `C1'
Exercise_1.C:44: `class C1' has no member named `x2'
*/

/* Result of execution 
% a.out
method obj1.f() from main: executes C::f()
method obj->f() from C1::h: executes C::f()
method obj->g() from C1::h: executes C3::g()
method obj3->f() from C1::h: executes C3::f()
*/

  • Hãy xem xét định nghĩa mẫu sau trong C ++:
       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.
    Chọn chữ ký, loại và tham số phù hợp là một phần của bài tập.

    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; }
       }; 
    

  • 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
    

  • 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.

    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.
    1.    C1 obj1; 
      
      3
    2.    C1 obj1; 
      
      4
    3. 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

    1. Phân cấp lớp được biểu thị bằng biểu đồ sau:
            C
           / \
          /   \
         C1   C3
         |
         |
         C2
      
    2. 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.
    3. 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.