Một thí nghiệm cho thấy hàm ảo có thể được gọi không chỉ từ bên ngoài lớp mà còn từ bên trong →
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 |
#include <iostream> using namespace std; class Pet { protected: string Name; public: Pet(string n) { Name = n; } virtual void MakeSound(void) { cout << Name << " the Pet says: Shh! Shh!" << endl; } void WakeUp(void) { MakeSound(); } }; 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) { Cat *a_cat; Dog *a_dog; a_cat = new Cat("Kitty"); a_cat -> WakeUp(); a_dog = new Dog("Doggie"); a_dog -> WakeUp(); return 0; } |
Một hàm mới tên là WakeUp đã được thêm vào lớp Pet. Nó được dự định để thực hiện tất cả các hành động của một con thú cưng khi nó thức dậy. Giả định rằng mỗi con thú cưng của chúng ta sau khi thức dậy sẽ kêu.
Ở đây, hàm MakeSound được gọi gián tiếp, thông qua hàm WakeUp được định nghĩa trong lớp cha (Pet) và hàm WakeUp không bị ghi đè ở bất cứ chỗ nào khác.
Chương trình sẽ xuất ra kết quả sau:
1 2 |
Kitty the Cat says: Meow! Meow! Doggie the Dog says: Woof! Woof! |