[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
2
1 Đa hình (Polymorphism)
2 Hàm ảo (Virtual function)
Gắn kết muộn (Late binding) Cài đặt hàm ảo
Khi sử dụng hàm ảo?
Hàm ảo (Pure Virtual Function)
Lớp trừu tượng (Abstract Class)
3 Hàm ảo Con trỏ
Mở rộng tương thích kiểu Ép kiểu lên (Upcasting)
Ép kiểu xuống (Downcasting)
(3)(Polymorphism)
Xét ví dụ: với thơng điệp “nhảy”,
kangaroo cóc nhảy hai kiểu khác
Chúng có hành vi “nhảy” nội dung hành vi
là khác
Đa hình (Polymorphism) tượng đối tượng thuộc
các lớp khác hiểu thông điệp theo
cách khác
(4)Hàm ảo
4
Hàm ảo cung cấp khả đa hình
Hàm “sử dụng” trước thực
(5)Hàm thành viên draw()
Xây dựng lớp cho nhiều kiểu hình vẽ khác
Ví dụ: Hình chữ nhật (Rectangle), hình trịn (Circle), hình oval
(Oval)…
Mỗi hình cụ thể đối tượng lớp Dữ liệu cho hình chữ nhật:chiều cao, chiều rộng Dữ liệu cho hình trịn:tâm, bán kính
Tất lớp kế thừa từ lớp cha: Figure
Các lớp có hàm draw()
Mục đích vẽ hình cụ thể hình
(6)Lớp Figure lớp con
(7)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() lớp, ví dụ:
Rectangle r; Circle c;
r.draw(); // Gọi hàm draw lớp Rectangle
c.draw(); // Gọi hàm draw lớp Circle
(8)Ví dụ 1: Các lớp mơ tả hình vẽ (3/5)
Hàm thành viên center()
8
Lớp cha Figure bao gồm hàm áp dụng cho
“tất cả” hình vẽ
Xét hàm center() để di chuyển hình vẽ từ vị trí
tại tới vị trí trung tâm hình
Cách làm: xóa hình vị trí tại, sau vẽ lại hình 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() sẽ gọi? Từ lớp nào?
Figure:: Center()
(9)Định nghĩa một 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 Lớp Triangle kế thừa hàm center() từ lớp cha Figure
Chỉ định nghĩa lại hàm draw(), không định nghĩa lại hàm center()
trong lớp Triangle
Liệu hàm center() có hoạt động với lớp Triangle?
Liệu hàm center() có gọi hàm draw() riêng lớp Triangle?
Nếu hàm gọi hàm draw() lớp Figure nghĩa khơng hoạt
động với lớp Triangle!
Chúng ta muốn: lớp Triangle kế thừa hàm center() lớp
cha Figure TỰ ĐỘNG gọi hàm draw() lớp Triangle
chứ KHÔNG PHẢI hàm draw() lớp Figure
Vấn đề: Hàm center() lớp Figure định nghĩa TRƯỚC
KHI lớp Triangle định nghĩa nên khơng biết tồn lớp
(10)Thêm một lớp mới Triangle
của lớp Figure