Chương 8: THỪA KẾ ẢO-TÍNH ĐA HÌNH Giáo viên: Võ Hồng Bảo Châu Khoa CNTT trường ĐH Lạc Hồng LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG MỤC TIÊU Giới thiệu khái niệm thừa kế ảo, hàm ảo 2 OOP-CHƯƠNG 8-TÍN
Trang 1Chương 8:
THỪA KẾ ẢO-TÍNH ĐA HÌNH
Giáo viên: Võ Hồng Bảo Châu Khoa CNTT trường ĐH Lạc Hồng
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
MỤC TIÊU
Giới thiệu khái niệm thừa kế ảo, hàm ảo
2 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH
NỘI DUNG CHI TIẾT
• TÍNH ĐA HÌNH
• LIÊN KẾT TĨNH
• LIÊN KẾT ĐỘNG
• HÀM ẢO
• THỪA KẾ ẢO
3 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH
Tính Đa Hình(Polymorphism)
• Đa hình: “nhiều hình thức”, hành động cùng tên có thể được thực hiện khác nhau đối với các đối tượng/các lớp khác nhau
Đường Thẳng Hình Tròn
Vẽ
4 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH
Trang 2TÍNH ĐA HÌNH
hành vi
• Kỹ thuật cho phép thay đổi nội dung của cùng 1 hành vi
trong 2 lớp cha – con
code này khác nhau
lớp mà không cần quan tâm đến hiện thực của hành vi này.
5 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH
VÍ DỤ VỀ TÍNH ĐA HÌNH
class Người void DiChuyển();
class ĐànÔng void DiChuyển();
class ĐànBà void DiChuyển();
class SHAPE
void Draw () { }
class CIRCLE
int x,y,r;
void Draw () { circle (x,y,r);
}
class RECTANGLE
int x1,y1, x2, y2;
void Draw () { rectangle(x1,y1, x2, y2);
}
class TRIANGLE
int x1,y1, x2, y2 , x3, y3;
void Draw () { line(x1,y1, x2, y2);
line(x2,y2, x3, y3);
line(x3,y3, x1, y1);
}
Đa hình tạo được tính mềm dẻo/linh động
của chương trình
6 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH
OVERLOADED VÀ OVERRIDDEN
– Nhằm cung cấp các dạng khác nhau của hành vi (danh sách tham
số khác nhau), nhưng vẫn có cùng tên gọi trong cùng một lớp.
– Hiện thực lại hành vi đã có của tổ tiên
– Phải có cùng tên và trùng mọi yếu tố tạo nên hành vi này.
LIÊN KẾT TĨNH
• Liên kết tĩnh (static binding):
– Xác định khi biên dịch chương trình.
– Dùng hàm thành viên.
– Gọi hàm của lớp cơ sở (lớp cha).
class ContactDir{ //
public:
int Lookup (const char
*name);
//
};
class SortedDir : public ContactDir {
public:
SortedDir(const int max) : ContactDir(max) {}
int Lookup(const char *name);
};
void main() { cout<<p->Lookup(“ABC”);
Trang 3LIÊN KẾT ĐỘNG
– Xác định khi thực thi chương trình.
– Dùng hàm ảo (virtual function).
– Gọi hàm của lớp dẫn xuất (lớp con).
– Thể hiện tính đa hình của OOP.
class ContactDir{
//
public:
virtual int Lookup (const char *name);
};
class SortedDir : public ContactDir {
//…
public:
int Lookup(const char *name);
};
void main() {
ContactDir c1(10);
SortedDir *p1; p1 = &c1;
cout<<p->Lookup(“ABC”);
SortedDir c2(20);
ContactDir *p2; p2 = &c2;
cout<<p->Lookup(“ABC”);
}
Gọi hàm của lớp nào ?
9 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH
HÀM ẢO
Xem kết qủa của việc khái quát hóa sau:
class ANIMAL
void Travel();
class Bird
void Travel()
class Fish
void Travel()
class Snake
void Travel()
Bạn có hình dung nổi một ANIMAL di chuyển như thế nào không?
Bạn có hình dung nổi một đối tượng thuộc các lớp này di chuyển như thế nào không?
Không Dùng hàm ảo
Có cụ thể
10 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH
HÀM ẢO
• Là kết qủa của việc khái quát hóa qúa cao đến nỗi
không biết viết code thế nào
• Là những hành vi chỉ khai báo mà không viết code
Để dành code cụ thể sẽ được hiện thực ở các lớp
dẫn xuất ( lớp cụ thể hơn)
• Tư duy tự nhiên:
– Từ các đối tượng cụ thể hàm cụ thể.
– Từ các lớp cụ thể có cùng tính chất hàm ảo.
11 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH
KHAI BÁO HÀM ẢO
• virtual Tên hàm ảo () { }
12 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH
Trang 4VÍ DỤ
Động cơ Nhiên liệu
Động cơ xăng
Động cơ 2 thì
Nhiên liệu Động cơ 4 thìNhiên liệu
13 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH
Class DongCo{
public:
virtual void NhienLieu(){ };
}
Class DongCoXang{
public:
void NhienLieu(){
cout<<“Dùng xăng hoặc xăng pha nhớt”; } }
public:
void NhienLieu(){
cout<<“Dùng dầu Diezel”;}
} Class DongCo2Thi{
public:
void NhienLieu(){
cout<<“Dùng xăng pha nhớt”;}
} Class DongCo4Thi{
public:
void NhienLieu(){
cout<<“Dùng xăng”;}
}
void main(){
DongCo *obj;
DongCo2Thi 2t;
DongCo4Thi 4t;
DongCoXang x;
DongCoDiezel d;
for(int i=0;i<4;i++) {
switch(i){
case 0: obj=&x;break;
case 1: obj=&d;break;
case 2: obj=&2t;break;
case 3: obj=&4t;break;}
obj->NhienLieu();}
}
Kết quả
in ra là gì?
14 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH
PHÂN LOẠI PHƯƠNG THỨC ẢO
– Khai báo nhưng không làm gì
– Dùng tạo sự liên kết động trong hệ thống lớp kế thừa.
– Có thể khai báo đối tượng thuộc lớp có phương thức ảo rỗng và
gởi thông điệp đến đối tượng đó.
Ví dụ: DongCo obj; obj.NhienLieu();
– Lớp chứa phương thức này được gọi là lớp trừu tượng.
– Không thể khai báo đối tượng thuộc lớp này cũng như không thể
gởi thông điệp đến phương thức ảo thuần.
Class A{
VÍ DỤ HÀM ẢO – TÍNH ĐA HÌNH
HÀM ẢO
GIÁ THÀNH
Dữ liệu: đơn giá Phương thức:
+giá thành +diện tích +trị giá
HÌNH TRÒN
Dữ liệu: bán kính Phương thức:
+khởi tạo
HÌNH CHỮ NHẬT
Dữ liệu: dài, rộng Phương thức:
+khởi tạo
Trang 5class GIATHANH{
protected: float dongia;
public:
giathanh (float c){ dongia=c);};
virtual dientich(){ }
float trigia() { return dientich()*dongia;}
}
class HINHTRON: public GIATHANH{
float bk;
public:
HINHTRON(float r, float c):
GIATHANH(c){
bk=r;}
float dientich(){
return bk*bk*M_PI;}
};
class HINHCN: public GIATHANH{
float dai,rong;
public:
HINHCN(float d,float r, float c):
GIATHANH(c){
dai=d;rong=r;}
float dientich(){ return dai*rong;}
};
void main(){
HINHTRON a(5,1000);
HINHCN b(2,4,2000);
cout<<“Tri gia hinh tron:<<a.trigia()<<endl;
cout<<“Tri gia hcn:”<<b.trigia()<<endl;
getch();
}
Nếu không khai báo hàm dientich là hàm ảo thì kết quả chương trình là gì?
17 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH
THỪA KẾ ẢO
clas s A
clas s D
18 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH
Ví dụ
class A{
int dulieu;
//
};
class B: public A{};
class C: public A{};
class D: public B, public C{
//
};
D thừa kế A
“2 lần”
D có 2 thành phần
dữ liệu và 2 thành phần hành vi
Dư thừa dữ liệu
19 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH
Giải quyết
• Để tránh tình trạng một thành phần trong lớp A xuất hiện 2 lần trong lớp D, sử dụng thừa kế ảo
class B: virtual public A{};
class C: virtual public A{};
class D: public B, public C{
//
};
20 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH
Trang 6TÓM TẮT
• Hàm ảo không nhất thiết phải được định nghĩa lại trong lớp
dẫn xuất.
• Một lớp có hàm ảo thuần túy được gọi là lớp ảo (lớp trừu
tượng) Không thể khai báo đối tượng thuộc lớp ảo nhưng
có thể khai báo con trỏ có kiểu lớp trừu tượng.
• Tính đa hình là khả năng các đối tượng của các lớp khác
nhau có quan hệ thừa kế phản ứng khác nhau đối với cùng
một lời gọi hàm thành phần.
21 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH
THANK YOU
22 OOP-CHƯƠNG 8-TÍNH ĐA HÌNH