Kế thừa đa cấp, đa cấp và phân cấp trong C ++

Trong bài viết này, bạn sẽ tìm hiểu về các mô hình kế thừa khác nhau trong lập trình C ++: Kế thừa nhiều cấp, đa cấp và phân cấp với các ví dụ.

Tính kế thừa là một trong những tính năng cốt lõi của ngôn ngữ lập trình hướng đối tượng. Nó cho phép các nhà phát triển phần mềm lấy ra một lớp mới từ lớp hiện có. Lớp dẫn xuất kế thừa các tính năng của lớp cơ sở (lớp hiện có).

Có nhiều mô hình kế thừa khác nhau trong lập trình C ++.

Kế thừa đa cấp C ++

Trong lập trình C ++, không chỉ bạn có thể dẫn xuất một lớp từ lớp cơ sở mà bạn còn có thể dẫn xuất một lớp từ lớp dẫn xuất. Hình thức kế thừa này được gọi là kế thừa đa cấp.

hạng A (…); hạng B: public A (…); hạng C: công cộng B (………);

Ở đây, lớp B có nguồn gốc từ lớp cơ sở A và lớp C được dẫn xuất từ ​​lớp dẫn xuất B.

Ví dụ 1: Kế thừa đa cấp C ++

 #include using namespace std; class A ( public: void display() ( cout<<"Base class content."; ) ); class B : public A ( ); class C : public B ( ); int main() ( C obj; obj.display(); return 0; )

Đầu ra

 Nội dung lớp cơ sở.

Trong chương trình này, lớp C có nguồn gốc từ lớp B (được dẫn xuất từ ​​lớp cơ sở A).

Đối tượng obj của lớp C được định nghĩa trong main()hàm.

Khi display()hàm được gọi, display()trong lớp A được thực thi. Đó là vì không có display()chức năng nào trong lớp C và lớp B.

Đầu tiên, trình biên dịch sẽ tìm kiếm display()hàm trong lớp C. Vì hàm không tồn tại ở đó nên nó sẽ tìm hàm trong lớp B (vì C có nguồn gốc từ B).

Hàm cũng không tồn tại trong lớp B, vì vậy trình biên dịch sẽ tìm kiếm nó trong lớp A (vì B có nguồn gốc từ A).

Nếu display()hàm tồn tại trong C, trình biên dịch sẽ ghi đè display()lớp A (vì ghi đè hàm thành viên).

Kế thừa nhiều C ++

Trong lập trình C ++, một lớp có thể được bắt nguồn từ nhiều hơn một lớp cha. Ví dụ: Một lớp Bat có nguồn gốc từ các lớp cơ sở Mammal và WingedAnimal. Nó có ý nghĩa vì dơi là động vật có vú cũng như động vật có cánh.

Ví dụ 2: Kế thừa nhiều trong lập trình C ++

 #include using namespace std; class Mammal ( public: Mammal() ( cout << "Mammals can give direct birth." << endl; ) ); class WingedAnimal ( public: WingedAnimal() ( cout << "Winged animal can flap." << endl; ) ); class Bat: public Mammal, public WingedAnimal ( ); int main() ( Bat b1; return 0; ) 

Đầu ra

Động vật có vú có thể sinh con trực tiếp. Động vật có cánh có thể vỗ.

Sự mơ hồ trong nhiều tài sản thừa kế

Vấn đề rõ ràng nhất với đa kế thừa xảy ra trong quá trình ghi đè hàm.

Giả sử, hai lớp cơ sở có cùng một chức năng không bị ghi đè trong lớp dẫn xuất.

Nếu bạn cố gắng gọi hàm bằng cách sử dụng đối tượng của lớp dẫn xuất, trình biên dịch sẽ hiển thị lỗi. Đó là bởi vì trình biên dịch không biết hàm nào để gọi. Ví dụ,

 class base1 ( public: void someFunction( ) (… .… … . ) ); class base2 ( void someFunction( ) (… .… … . ) ); class derived : public base1, public base2 ( ); int main() ( derived obj; obj.someFunction() // Error! )  

Vấn đề này có thể được giải quyết bằng cách sử dụng hàm phân giải phạm vi để chỉ định hàm nào sẽ phân loại base1 hoặc base2

 int main () (obj.base1 :: someFunction (); // Hàm của lớp base1 được gọi là obj.base2 :: someFunction (); // Hàm của lớp base2 được gọi.)

Kế thừa phân cấp C ++

Nếu nhiều lớp được kế thừa từ lớp cơ sở, nó được gọi là kế thừa phân cấp. Trong kế thừa phân cấp, tất cả các tính năng phổ biến trong các lớp con đều được đưa vào lớp cơ sở.

Ví dụ: Vật lý, Hóa học, Sinh học có nguồn gốc từ lớp Khoa học.

Cú pháp kế thừa phân cấp

 class base_class (…) class first_derived_class: public base_class (…) class second_derived_class: public base_class (…) class third_derived_class: public base_class (…)

thú vị bài viết...