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ạ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
- 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
- protected: Khai báo 2 biến số thực
- private: Khai báo 2 biến chuỗi
+ 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
+ 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
+ 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();
}
+ 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.
void nhap() // nhập giá trị a,b
- LopB: có hàm
void nhap() // nhập giá trị a,b,c
- Khi đó:
- Ví dụ:
- LopA: có hàmvoid 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)
Ví dụ:
- Ý nghĩa:
Cho phép sửa đổi hàm của lớp cho không phù hợpVí 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
· 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
- 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
- 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
0 Comments