6.3.1 Ghi đè phương thức trong lớp dẫn xuất (1)

Khi một lớp con khai báo một phương thức có tên trùng với phương thức trong lớp cha của nó, phương thức gốc sẽ bị ghi đè. Khi đó bất kỳ lời gọi nào đến phương thức đó được thực hiện bên trong lớp con sẽ refer đến phương thức mới.

Nhìn vào ví dụ sau →

Ví dụ này chứng minh hai khía cạnh quan trọng của việc ghi đè (overriding).

Thứ nhất, chúng ta có thể trải nghiệm được kết quả của việc ghi đè khi gọi hàm MakeSound từ bên trong các đối tượng a_cata_dog. Chúng ta rõ ràng là sẽ “nghe” thấy tiếng kêu phù hợp với con vật đã phát ra nó.

Thứ hai, chúng ta có thể thấy rằng các hiệu ứng của overriding có thể bị hủy bỏ nếu chúng ta sử dụng toán tử static_cast theo cách ngược lại. Bạn có nhớ rằng trong phần trước chúng ta đã sử dụng toán tử này để coi một con trỏ tới lớp cha như một con trỏ trỏ tới lớp con của nó (gọi là downcasting). Trong ví dụ này, chúng ta đang làm ngược lại: chúng ta đang coi một con trỏ trỏ tới một lớp con (Dog hoặc Cat) như một con trỏ trỏ tới lớp cha của chúng (Pet) – việc này được gọi là “uppercasting“.

Trong trường hợp của chúng ta, uppercasting không làm ẩn đi các việc thực hiện ban đầu của hàm MakeSound.

Điều này có nghĩa là chương trình ví dụ sẽ xuất các dòng sau ra màn hình:

Kitty the Cat says: Meow! Meow!

Kitty the Pet says: Shh! Shh!

Doggie the Dog says: Woof! Woof!

Doggie the Pet says: Shh! Shh!