No2 - Tính kế thừa trong lập trình hướng đối tượng

1. Thế nào là kế thừa?

- Trong lập trình hướng đối tượng C++ có 2 công việc phải thực hiện. Đó là:

+  Xây dựng các lớp: một chương trình các lớp độc lập với nhau
+ Tạo đối tượng từ các lớp để hoạt động
- Tính kề thừa xảy ra khi người lập trình xây dựng nhiều lớp

Định nghĩa kế thừa:

- Đó là việc một lớp lấy toàn bộ nội dung cho phép của một lớp khác làm tài nguyên của chính nó.
- Khi kế thừa: lớp lấy tài nguyên để kế thừa thì có thể quy định phạm vi sử dụng tài nguyên kế thừa.
- Mô hình kế thừa: Giả sử có 2 lớp

      + LopA: có tài nguyên cho kế thừa
      + LopB: kế thừa tài nguyên từ lớp A

Khi đó, cú pháp lệnh của C++ mô tả việc kế thừa như sau

class LopA
{
public:
// tài nguyên ở phạm vi (1)
protected:
// tài nguyên ở phạm vi (2)
private:
// tài nguyên ở phạm vi (3)
};
class LopB: public| protected| private LopA
{
...//Các tài nguyên lớp B
};

Giải thích:

-  LopA: được xây dựng trước, tài nguyên ở phần (1), (2) thì được lớp B kế thừa.
-  Khi lớp B kế thừa, sử dụng tài nguyên đó theo qui định của nó. Cụ thể:
             
                +  public: tài nguyên kế thừa được sử dụng ở phạm vi public
                +  protected: tài nguyên kế thừa được sử dụng ở phạm vi protected
                +  private: tài nguyên kế thừa được sử dụng ở phạm vi private

2/ Bài tập minh hoạ

Bài tập 1:

- Lớp A:

             -  public: Khai báo 2 biến số nguyên
             -  protected: Khai báo 2 biến số thực
             -  private: Khai báo 2 biến chuỗi

- Lớp B: 

Kế thừa tài nguyên chỉ ở mức public
+ Phạm vi public của lớp B: Viết xử lý nhập dữ liệu cho các biến kế thừa từ lớp A

- Tạo đối tượng lớp B thực hiện hoạt động

Bài tập 2:

- Lớp A:

     - Ở phạm vi public
                   + Khai báo a,b là hai biến số nguyên.
                   + Thực hiện giải phương trình bậc 1 với 2 tham số a,b

- Lớp B:

                  + Khai báo biến số
                  + Kế thừa LopA, kết hợp biến số giải phương trình bậc 2

#include "conio.h"
#include "iostream.h"
#include "math.h"
class LopA
{
protected:
                    int a,b;
void gptb1(int a,int b)
{
if (a==0)
          if(b==0)
                  cout<<"\n\t Vo so nghiem";
          else
                  cout<<"\n\t Vo nghiem";
else
          cout<<"\n\t co nghiem la : "<<-b/a;
};
void nhap()
{
               cout<<"\n\t a = "; cin>>a;
               cout<<"\n\t b = "; cin>>b;
};
};
class LopB: public LopA  // B co a,b, ham gptb1, ham nhap()
 {
public:
         int c;
void nhap()
{
         cout<<"\n\t Nhap a : "; cin>>a;
         cout<<"\n\t Nhap b : "; cin>>b;
         cout<<"\n\t Nhap c : "; cin>>c;
};
void gptb2()
{
if (a==0)
        gptb1(b,c);
else
{
        float dt=b*b-4*a*c;
        if (dt<0)
                   cout<<"\n\t Vo nghiem ";
        if (dt==0)
                   cout<<"\n\t mot nghiem : "<<-b/(2*a);
        if (dt>0)
                 {
                             cout<<"\n\t x1 = "<<(-b + sqrt(dt))/(2*a);
                             cout<<"\n\t x2 = "<<(-b - sqrt(dt))/(2*a);
                  }
};
};
};
void main()
{
clrscr();
LopB obj;
obj.nhap();
obj.gptb2();
getch();
}

3. Hiện tượng nạp chồng hàm khi kế thừa

- Bất cứ khi nào có tính kế thừa xảy ra trong chương thì thì cũng có khả năng xảy ra hiện tượng nạp chồng hàm (Overload).

- Định nghĩa: 

Là việc lớp nhận tài nguyên kế thừa, xây dựng một hàm hoàn toàn trùng lặp với hàm của lớp cho.

- Ví dụ:

-  LopA: có hàm
            void nhap() // nhập giá trị a,b
-  LopB: có hàm
            void nhap() // nhập giá trị a,b,c
 - Khi đó: 
Hàm nhập của lớp B hoàn toàn đè lên hàm nhập được kế thừa từ lớp A (hiện tượng overload xảy ra)

- Ý nghĩa:

Cho phép sửa đổi hàm của lớp cho không phù hợp

Ví dụ:  
Tạo lớp chỉ có phạm vi public
· Khai báo 2 biến số nguyên
· Viết hàm nhập: void nhap()
· Viết hàm tinh: void tinh()
Tính tổng 2 số và in ra
Tạo lớp 2 kế thừa tài nguyên lớp 1 ở phạm vi public
     - Viết hàm tinh: void tinh(), tính tích 2 số và in ra
Tương tự tạo lớp 3, hàm tinh là thương 2 số
Tạo 3 đối tượng:
      - Lớp 1,Lop2,Lop3
      - Gọi hàm nhập và gọi hàm tính lần lượt 3 đối tượng

Post a Comment

0 Comments