1. Chương trình 1 minh hoạ cách làm việc của phương thức tĩnh: khai lớp cơ sở là xeco (xe cộ) và 3 lớp dẫn xuất từ nó là xecon, xetai và tauthuy (xe con, xe tải, tàu thuỷ). Khi khai báo các lớp dẫn xuất đều có từ public, điều đó làm cho các lớp dẫn xuất thừa kế các phương thức của lớp cha. Lớp xeco, xecon và tauthuy đều có phương thức thongbao (trùng tên, trùng số đối, kiểu của đối và giá trị trả về).
Tất cả các phương thức trong chương trình đều là phương thức tĩnh. Lời gọi tới phương thức tĩnh bao giờ cũng xác định rõ phương thức nào được gọi trong số các phương thức trùng tên của các lớp có quan hệ thừa kế theo quy tắc sau:
· Nếu lời gọi xuất phát từ một đối tượng của lớp nào thì phương thức của lớp đó sẽ được gọi (xem dòng 44, 45, 47), nếu không thấy thì sẽ tìm ở lớp cha (dòng 46, 52: do lớp xetai không có phương thức thongbao() nên phương thức thongbao() của lớp cha được gọi).
· Nếu lời gọi xuất phát từ một con trỏ kiểu lớp nào thì phương thức của lớp đó sẽ được gọi bất kể con trỏ chứa địa chỉ của đối tượng nào (xem dòng 50, 51, 53). Các dòng 56-61 đều dùng phương thức thongbao() của lớp cha vì p là con trỏ kiểu lớp xeco.
Dòng 42 minh hoạ một nguyên tắc quan trọng: con trỏ của lớp cơ sở có thể dùng để chứa địa chỉ các đối tượng của lớp dẫn xuất.
2. Cách định nghĩa phương thức ảo. Trong Chương trình 1 ở trên ta có phương thức thongbao() ở cả 3 lớp xeco, xecon, tauthuy với tính chất: trùng tên, trùng kiểu, trùng số đối và kiểu của đối. Để chuyển cả 3 phương thức này thành ảo ta chỉ cần thêm từ khoá virtual vào trước phương thức thongbao() thuộc lớp cơ sở, tức là dòng 8 trở thành:
virtual void thongbao(void){cout<<"Thong bao cua lop xeco\n";}
hoặc dùng cách thứ hai: thêm từ khoá virtual vào cả 3 phương thức thongbao() của 3 lớp. Ta gọi Chương trình 1 sau khi đã thêm từ virtual vào dòng 8 là Chương trình 2
Quy tắc gọi phương thức ảo. Phương thức ảo chỉ khác phương thức tĩnh khi được gọi từ một con trỏ. Lời gọi phương thức ảo từ một con trỏ chưa cho biết rõ phương thức nào trong số các phương thức ảo trùng tên của các lớp có quan hệ thừa kế sẽ được gọi. Điều này phụ thuộc vào đối tượng cụ thể mà con trỏ đang trỏ tới: con trỏ đang trỏ tới đối tượng của lớp nào thì phương thức của lớp đó sẽ được gọi (đó chính là sự liên kết động). Theo quy tắc đó các dòng 56 - 61 của Chương trình 2 sẽ in ra: “Thông báo cua lop xeco, Thông báo cua lop xecon, Thông báo cua lop xeco, Thông báo cua lop tauthuy, Thông báo cua lop xecon”. Các dòng 44-47, 50-53 vẫn in kết quả như cũ.
Ta nhận thấy cùng một câu lệnh p->thongbao() ở các dòng 56 - 61 nhưng nó tương ứng với nhiều phương thức khác nhau, đây chính là tương ứng bội. Khả năng này rõ ràng cho phép xử lý nhiều đối tượng khác nhau, nhiều công việc, thậm chí nhiều thuật toán khác nhau theo cùng một cách thức, cùng một lược đồ.
0 nhận xét:
Đăng nhận xét