[r]
(1)NGƠN NGỮ LẬP TRÌNH
Bài 8:
Đa Hình Hàm Ảo
Giảng viên: Lê Nguyễn Tuấn Thành Email: thanhlnt@tlu.edu.vn
(2)NỘI DUNG
1 Đa hình (Polymorphism)
2 Cơ bản về Hàm ảo (Virtual Function)
Gắn kết trễ (Late binding) Cài đặt hàm ảo
Khi sử dụng hàm ảo?
Hàm ảo thuần (Pure Virtual Function)
Lớp trừu tượng (Abstract Class)
3 Con trỏ Hàm ảo
Mở rộng tương thích kiểu Ép kiểu lên (Upcasting)
Ép kiểu xuống (Downcasting) 2
(3)(POLYMORPHISM)
Một ba trụ cột quan trọng OOP
Đa hình (Polymorphism) hiện tượng đối
tượng thuộc lớp khác hiểu một
thông điệp theo cách khác
Ví dụ: thơng điệp “nhảy”, một
kangaroo một cóc sẽ nhảy hai kiểu khác
nhau
Chúng có hành vi “nhảy” nội dung
hành vi khác
(4)CƠ BẢN VỀ HÀM ẢO
Hàm ảo
Hàm ảo cung cấp khả đa hình
Hàm “sử dụng” trước thực định
(5)HÀM THÀNH VIÊN DRAW()
Xây dựng lớp cho nhiều kiểu hình vẽ khác
nhau
Hình chữ nhật, hình trịn, hình oval …
Mỗi hình cụ thể đối tượng lớp
Dữ liệu hình chữ nhật: chiều cao, chiều rộng Dữ liệu hình trịn: tâm, bán kính
Tất cả lớp đều kế thừa từ một lớp cha:
Figure
Các lớp đều có hàm draw()
Mục đích vẽ hình hình
Mỗi lớp có cài đặt khác tương ứng với loại
(6)VÍ DỤ VỚI CÁC LỚP MƠ TẢ HÌNH VẼ (2/5)
SỬ DỤNG HÀM THÀNH VIÊN DRAW()
Mỗi lớp cần định nghĩa hàm draw() riêng Có thể gọi hàm draw() của mỗi lớp, ví dụ:
Rectangle r; Circle c;
r.draw(); // Gọi hàm draw của lớp Rectangle
c.draw(); // Gọi hàm draw của lớp Circle
(7)HÀM THÀNH VIÊN CENTER()
Lớp cha Figure bao gồm những hàm có thể áp
dụng cho “tất cả” hình vẽ
Xét hàm center() để di chuyển một hình vẽ từ vị
trí hiện tại tới vị trí trung tâm hình
Cách làm: xóa hình vị vị trí tại, sau vẽ lại
vị trí trung tâm hình
Hàm Figure::center() sử dụng (gọi) hàm draw() để
vẽ lại hình
Câu hỏi:
Hàm draw() gọi? Từ lớp nào?
(8)VÍ DỤ VỚI CÁC LỚP MƠ TẢ HÌNH VẼ (4/5):
ĐỊNH NGHĨA LỚP HÌNH VẼ MỚI
Xét lớp hình vẽ mới: lớp Triangle kế thừa từ lớp
Figure
Hàm center() lớp Triangle kế thừa từ lớp cha
Figure
Liệu hàm có hoạt động với lớp Triangle? Hàm sử dụng hàm draw() riêng lớp Triangle!
Nếu hàm sử dụng hàm Figure::draw() -> không hoạt
động với lớp Triangle
Muốn: kế thừa hàm center() để sử dụng hàm
Triangle::draw() KHÔNG PHẢI hàm
Figure::draw()
Nhưng lớp Triangle CHƯA ĐƯỢC định nghĩa hàm
Figure::center() định nghĩa!
(9)HÀM ẢO
Hàm ảo câu trả lời cho vấn đề Nói với trình biên dịch:
Khơng biết hàm cài đặt
Đợi sử dụng chương trình Sau lấy phần cài đặt từ đối tượng cụ thể
Được gọi gắn kết trễ (late binding) hoặc gắn kết
động (dynamic binding)
Những hàm ảo cài đặt chế late binding
(10)VÍ DỤ DOANH SỐ BÁN HÀNG (1/2)
Xây dựng chương trình giúp lưu trữ hồ sơ cho một
cửa hàng phụ tùng ô tô
Mục đích: lưu trữ doanh số bán hàng
Khơng lường trước hết tất loại doanh số bán hàng Đầu tiên doanh số bán lẻ thông thường
Sau đó: doanh số bán hàng giảm giá, doanh số bán
hàng qua thư điện tử, …