ngôn ngữ lập trình đa hìnhfit.hnue.edu.vn/~dungntp/nnlt/9.dahinh.pdf · xét yêu cầu 1...

23
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

Upload: others

Post on 26-Feb-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

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 6

Ví dụ với bài toán ở trên

02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 7

Ví dụ với bài toán ở trên

02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 8

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