Chương trình ví dụ thứ hai sẽ cho thấy một khía cạnh khác của overriding.
Nó ở đây →
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include <iostream> using namespace std; class Pet { protected: string Name; public: Pet(string n) { Name = n; } void MakeSound(void) { cout << Name << " the Pet says: Shh! Shh!" << endl; } }; class Cat : public Pet { public: Cat(string n) : Pet(n) { } void MakeSound(void) { cout << Name << " the Cat says: Meow! Meow!" << endl; } }; class Dog : public Pet { public: Dog(string n) : Pet(n) { } void MakeSound(void) { cout << Name << " the Dog says: Woof! Woof!" << endl; } }; int main(void) { Pet *a_pet1, *a_pet2; Cat *a_cat; Dog *a_dog; a_pet1 = a_cat = new Cat("Kitty"); a_pet2 = a_dog = new Dog("Doggie"); a_pet1 -> MakeSound(); a_cat -> MakeSound(); a_pet2 -> MakeSound(); a_dog -> MakeSound(); return 0; } |
Lần này, chúng ta không sử dụng static_cast, nhưng một số các con trỏ được khai báo rõ ràng là con trỏ trỏ đến lớp cha (Pet). Bản thân các lớp sẽ không bị ảnh hưởng. Chúng ta chỉ đơn thuần thay đổi cách mà thức xử lý các con trỏ mà thôi.
Các kết quả dự kiến (và nhận được) gần như giống nhau – chương trình sẽ xuất văn bản sau ra màn hình:
1 2 3 4 |
Kitty the Pet says: Shh! Shh! Kitty the Cat says: Meow! Meow! Doggie the Pet says: Shh! Shh! Doggie the Dog says: Woof! Woof! |