Bây giờ sẽ là một hệ thống phân lớp phức tạp hơn một chút →
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 38 39 40 41 42 43 44 45 46 47 |
#include <iostream> #include <string> using namespace std; class Pet { protected: string name; public: Pet(string name) { this -> name = name; } void MakeSound(void) { cout << name << " is silent :(" << endl; } }; class Dog : public Pet { public: Dog(string name) : Pet(name) {} void MakeSound(void) { cout << name << " says: Woof!" << endl; } }; class GermanShepherd : public Dog { public: GermanShepherd(string name) : Dog(name) {} void MakeSound(void) { cout << name << " says: Wuff!" << endl; } }; class MastinEspanol : public Dog { public: MastinEspanol(string name) : Dog(name) {} void MakeSound(void) { cout << name << " says: Guau!" << endl; } }; void PlayWithPet(Pet &pet) { pet.MakeSound(); } int main(void) { Pet pet("creature"); Dog dog("Dog"); GermanShepherd gs("Hund"); MastinEspanol mes("Perro"); PlayWithPet(pet); PlayWithPet(dog); PlayWithPet(gs); PlayWithPet(mes); return 0; } |
Chúng ta có thể minh họa cấu trúc của nó bằng sơ đồ sau đây
Có một hàm gọi là PlayWithPet, có tham số kiểu Pet & (một tham chiếu đến đối tượng của Pet). Hàm được gọi với bốn đối tượng khác nhau lấy từ các cấp độ khác nhau trong hệ thống phân cấp lớp.
Điều này có thể xảy ra bởi vì (như chúng ta đã đề cập) một đối tượng của lớp bậc cao sẽ tương thích với các đối tượng của bất kỳ lớp con nào. Chúng ta có thể khai báo một tham số hình thức có kiểu là một lớp bậc cao và truyền một tham số thực tế là đối tượng của các lớp con của tham số hình thức. Đây là chính xác những gì chúng ta sẽ làm trong ví dụ này.
Lưu ý rằng hàm MakeSound ở đây không phải là hàm ảo nhé, chúng ta không bàn về đa hình ở đây.