Bài giảng Lập trình hướng đối tượng: Bài 7 Đa hình do Phạm Thị Bích Vân biên soạn cung cấp cho người học các kiến thức: Các phương thức ảo, lớp cơ sở trừu tượng, các thành viên ảo của một lớp,.! | Bài 7: Đa hình Giới thiệu Đa hình là khả năng cho phép: Cho phép các lớp được định nghĩa các phương thức trùng nhau: cùng tên, cùng số lượng và kiểu tham số, cùng kiểu trả về. Việc định nghĩa phương thức trùng nhau của các lớp kế thừa nhau còn được gọi là sự nạp chồng phương thức. Khi gọi các phương thức trùng tên, dựa vào đối tượng đang gọi mà chương trình sẽ thực hiện phương thức của lớp tương ứng, và do đó, sẽ cho các kết quả khác nhau. Ví dụ: Xây dựng lớp người, lớp sinh viên, lớp giáo viên cùng có phương thức Nhap() và phương thức Xuat(). Như vậy đa hình là khả năng cho phép viết chương trình để xử lý tổng quát các đối tượng của tất cả các lớp trong một phân cấp như các đối tượng của lớp cơ sở. Do vậy một thông điệp được gửi đi mà không cần biết đối tượng nhận thuộc lớp nào. 2 Các phương thức ảo Xét ví dụ 3 lớp A,B,C đều có phương thức xuat() A *p, *q, *r; // p, q, r là con trỏ kiểu A A a; // a là đối tượng kiểu A B b; // b là đối tượng kiểu B C c; // c là đối tượng kiểu c //----------------- p = &a ; q = &b ; r = &c ; //------------ p->xuat(); q->xuat(); r->xuat(); Cả ba câu lệnh đều gọi đến A::xuat() Giải pháp: Xây dựng xuat() là phương thức ảo Các phương thức ảo Giả sử A là lớp cơ sở. B,C,D là lớp dẫn xuất. Giả sử các lớp này đều có phương thức xuat(). Để định nghĩa các phương thức này là ảo có 2 cách: Hoặc thêm từ khoá virtual vào dòng tiêu đề của phương thức bên trong định nghĩa lớp cơ sở A. Hoặc thêm từ khoá virtual vào dòng tiêu đề bên trong định nghĩa của tất cả các lớp A, B, C và D Các phương thức ảo Khi xây dựng một cấu trúc cây phân cấp, người lập trình chuẩn bị các hành vi chung của lớp đó. Hành vi giao tiếp chung sẽ được dùng để thể hiện cùng hành vi, nhưng có các hành động khác nhau đó là phương thức ảo. Ví dụ: Đọc thêm ví dụ trang 122 - giáo trình LTHĐT Các phương thức ảo class Base { public: virtual void Display() { cout< <"class Base"<