y 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 y Bản chất: Sửa code của cùng 1 hành vi ở 2 lớp cha con để d à khá h để code này khác nhau y Đa hình tạo r
Trang 1CHƯƠNG 8
1
Trang 3NỘI DUNG CHI TIẾT
Trang 5y 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
y Bản chất: Sửa code của cùng 1 hành vi ở 2 lớp cha con
để d à khá h
để code này khác nhau
y Đa hình tạo ra khả năng cho phép gọi một hành vi
của một lớp mà không cần quan tâm đến hiện thực
của hành vi này.
Trang 6VÍ DỤ VỀ TÍNH ĐA HÌNH
class ĐànBà
ể
class CIRCLE int x,y,r;
id D ()
void DiChuyển(); void Draw ()
{ circle (x,y,r);
} class RECTANGLE
class Người
void DiChuyển();
class SHAPE void Draw () {
}
class RECTANGLE int x1,y1, x2, y2;
void Draw () { rectangle(x1,y1, x2, y2); }
class ĐànÔng void DiChuyển();
class TRIANGLE int x1,y1, x2, y2 , x3, y3; void Draw ()
void DiChuyển(); { line(x1,y1, x2, y2);
Trang 7OVERLOADED VÀ OVERRIDDEN
y Overloaded methods:
7
{ 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
một lớp.
y Overridden methods:
{ 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.
Trang 8int Lookup(const char *name);
Trang 9LIÊN KẾT ĐỘNG
y Liên kết động ( dynamic binding )
9
{ 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)
Gọi hàm của lớp nào ?
{ 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.
Trang 10Không Î Dùng hàm ảo
Trang 11HÀM ẢO
11
không biết viết code thế nào
Để dành code cụ thể sẽ được hiện thực ở các lớp dẫn
Trang 12KHAI BÁO HÀM ẢO
Trang 13VÍ DỤ
13
Động cơNhiên liệu
Động cơ xăngNhiên liệuệ Động cơ diezelNhiên liệuNhiên liệu
Động cơ 2 thì
Nhiên liệu Động cơ 4 thìNhiên liệu
Trang 14cout<<“Dùng dầu Diezel”;}
virtual void NhienLieu(){ };
void NhienLieu(){
cout<<“Dùng xăng”;}
}
for(int i=0;i<4;i++){
Trang 15PHÂN LOẠI PHƯƠNG THỨC ẢO
y Phương thức ảo rỗng
15
{ 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ó hể kh i bá đối h ộ lớ ó h hứ ả ỗ à
{ 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(); g j j
y Phương thức ảo thuần
{ 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{
{ Class A{
{ public :
Trang 16+khởi tạo +diện tích
Dữ liệu: dài, rộng Phương thức:
+khởi tạo +diện tích
GV: Võ Hồng Bảo Châu
OOP-CHƯƠNG 8-THỪA KẾ ẢO-TÍNH ĐA HÌNH
Trang 17class GIATHANH{ class HINHCN: public GIATHANH{
17
{protected: float dongia;
Trang 19class B: public A{};
class C: public A{};
class D: public B, public C{
Trang 20Giải quyết
y Để tránh tình trạng một thành phần trong lớp A xuất
20
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{
Trang 21THANK YOU