View
1
Download
0
Category
Preview:
Citation preview
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 1
Ngôn ngữ lập trình
Đa hình và hàm ảo
fit.hnue.edu.vn/~dungntp/NNLT
Nội dung • Đa hình
• Hàm ảo
• Liên kết muộn
• Hàm thuần ảo
• Lớp trừu tượng
• Vấn đề cắt lát
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 2
Xét yêu cầu 1 bài toán như sau:
• Có 100 người đang xếp hàng chờ kê khai thông tin
• Chỉ có đủ 100 tờ giấy cho họ kê khai
• Không biết có bao nhiêu người sẽ kê khai là cán bộ, giáo viên và bao nhiêu người sẽ kê khai là sinh viên
• Làm thế nào để đảm bảo đủ giấy kê khai cho 100 người theo đúng thông tin của họ?
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 3
Giải pháp
• => Chỉ khi đến lượt, người kê khai thông báo họ là SV hay là CB, GV thì mới in tờ khai tương ứng cho họ (sử dụng con trỏ)
• Giải pháp này được gọi là tính đa hình trong lập trình hướng đối tượng
• Có thể hiểu đa hình là nhiều hình thức thể hiện khác nhau cho một loại công việc
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 4
Cách làm
• Để thấy rõ tính đa hình đôi khi phải sử dụng Hàm ảo
• Hàm ảo là hàm được khai báo với từ khóa virtual
• Một hàm được khai báo là hàm ảo ở lớp cơ sở thì nó cũng là hàm ảo ở lớp dẫn xuất cho dù ở lớp dẫn xuất nó có được khai báo bằng từ khóa virtual hoặc không
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 5
Ví dụ với bài toán ở trên
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 9
• N được khai
báo là mảng
các ConNguoi
• => hàm nhập
nào được gọi
tại 2 trường
hợp 1 và 2?
Nhìn lại khai báo lớp ConNguoi.
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 10
• Nếu không có từ khóa
virtual thì đối tượng N
trong hàm main() là 1 đối
tượng thuộc lớp ConNguoi
• => Khi gọi N[i]->nhap() thì
hàm nhap() của lớp
ConNguoi sẽ được gọi.
Nhìn lại khai báo lớp ConNguoi.
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 11
• Thực tế hàm nhap() của lớp
ConNguoi được khai báo với
từ khóa virtual
• => Dù N là đối tượng thuộc
lớp ConNguoi nhưng N[i]
được tạo ra từ lớp nào thì hàm
nhap() của lớp đấy được gọi
• Việc này gọi là: liên kết muộn
Một số chú ý khi dùng hàm ảo
• Một hàm đã được khai báo là ảo thì phải được
định nghĩa.
• Khi một hàm ảo được định nghĩa trong lớp dẫn
xuất thì được gọi là ghi đè (overridden)
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 12
Chú ý phân biệt ghi đè (overridden) và định nghĩa lại (redefined)
• Giống nhau: thay đổi định nghĩa 1 hàm trong
lớp dẫn xuất
• Khác nhau:
– Ghi đè là thay đổi định nghĩa một hàm ảo
– Định nghĩa lại là thay đổi định nghĩa một hàm
không phải là ảo
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 13
Một số chú ý khi dùng hàm ảo
• Chỉ khi nào cần đến những liên kết muộn thì
mới nên dùng hàm ảo (nếu không sẽ rất tốn bộ
nhớ và làm chương trình chạy chậm)
• Hàm hủy nên luôn được khai báo là hàm ảo
(nếu không, hàm hủy ở lớp dẫn xuất có thể
không được gọi)
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 14
Qua ví dụ trên ta đã nắm được Đa hình
Hàm ảo
Liên kết muộn
• Hàm thuần ảo?
• Lớp trừu tượng?
• Vấn đề cắt lát?
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 15
Xét ví dụ khác
• Viết 1 chương trình cho phép người dùng lựa chọn loại hình mình muốn vẽ.
• Nếu chọn hình vuông thì phương thức vẽ của hình vuông được gọi
• Nếu chọn hình tròn thì phương thức vẽ của hình tròn được gọi
• ….
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 16
Cách giải quyết?
• Vẫn phải vận dụng tính đa hình, hàm ảo, và liên kết muộn.
• Trước tiên tạo lớp Hinh là lớp cơ sở trong đó có phương thức vẽ
• Sau đó tạo các lớp HVuong, HTron, HTamgiac, … mỗi lớp có một phương thức vẽ riêng
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 17
Cách giải quyết?
• Tuy nhiên, phương thức vẽ của lớp cơ sở Hinh
chưa thực sự biết vẽ như thế nào.
• Khi đó phương thức này sẽ được khai báo là
hàm thuần ảo
• Cách viết: virtual void ve() = 0;
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 18
Lớp trừu tượng
• Một lớp có một hoặc nhiều hàm thuần ảo
được gọi là lớp trừu tượng
• Khi đã là lớp trừu tượng thì lớp đó chỉ có thể
được dùng làm lớp cơ sở (không thể tạo ra các
đối tượng từ một lớp trừu tượng)
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 19
Lớp trừu tượng
• Lớp dẫn xuất từ một lớp trừu tượng cũng là
lớp trừu tượng trừ khi các hàm thuần ảo được
định nghĩa và không tạo ra một hàm thuần ảo
mới nào nữa
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 20
Vấn đề cắt lát
• Vấn đề cắt lát xảy ra khi thực hiện chuyển
kiểu lên. (gán 1 đối tượng của lớp dẫn xuất cho
1 đối tượng của lớp cơ sở, khi đó những biến
thành viên không nằm trong lớp cơ sở bị biến
mất => gọi là cắt lát)
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 21
Tổng kết bài Đa hình
Hàm ảo
Liên kết muộn
Hàm thuần ảo
Lớp trừu tượng
Vấn đề cắt lát
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 22
Bài tập
• Tạo lớp cơ sở trừu tượng là DongVat
• Tạo các lớp dẫn xuất là Cho, Meo, Ga, Vit, Chim, …
• Định nghĩa các phương thức đi lại và tiếng của mỗi loại động vật
• Viết chương trình cho phép người dùng lựa chọn con vật yêu thích và chương trình sẽ ngay lập tức hiển thị tiếng kêu và cách đi lại của con vật vừa chọn
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 23
Recommended