Chương trình sau sẽ thể hiện rõ nhưng những kết luận mà chúng tôi đã đưa ra ở trang trước →
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> #include <string> using namespace std; class Pet { protected: string Name; public: Pet(string n) { Name = n; } void Run(void) { cout << Name << ": I'm running" << endl; } }; class Dog : public Pet { public: Dog(string n) : Pet(n) {}; void MakeSound(void) { cout << Name << ": Woof! Woof!" << endl; } }; class Cat : public Pet { public: Cat(string n) : Pet(n) {}; void MakeSound(void) { cout << Name << ": Meow! Meow!" << endl; } }; int main(void) { Pet *a_pet1 = new Cat("Tom"); Pet *a_pet2 = new Dog("Spike"); a_pet1 -> Run(); // 'a_pet1 -> MakeSound();' is not allowed here! a_pet2 -> Run(); // 'a_pet2 -> MakeSound();' is not allowed here! return 0; } |
Phân tích source code và lưu ý đến cách mà con trỏ trỏ tới các đối tượng lớp cha (con trỏ kiểu Pet *) có thể trỏ đến các đối tượng của lớp con (Cat, Dog).
Các lệnh ở những dòng đánh dấu comment là không hợp lệ trong bối cảnh này.
Chương trình xuất ra kết quả sau:
1 2 |
Tom: I'm running Spike: I'm running |