Tính Kế Thừa Trong Lập Trình Hướng Đối Tượng

Bài số 7 trong 10 bài của series Hướng đối tượng C++

Xin chào tất cả mọi người, mình quay lại rồi đây. Thời gian vừa rồi mình khá bận nên không có thời gian chia sẻ tiếp với mọi người. Và hôm nay chúng ta tiếp tục tới phần tiếp theo là tính kế thừa trong lập trình hướng đối tượng nhé

Tính Kế Thừa Trong C++

Tính kế thừa là một trong những đặc tính quan trọng nhất của lập trình hướng đối tượng.
Nó là khả năng lấy một thuộc tính, đặc tính của một lớp cha để áp dụng lên lớp con.

Lớp kế thừa các thuộc tính từ một lớp khác được gọi là Lớp con hoặc Lớp dẫn xuất.
Lớp có các thuộc tính được kế thừa bởi lớp con được gọi là Lớp cha hoặc Lớp cơ sở.

Tại sao chúng ta cần dùng tính kế thừa? Và khi nào thì cần dùng nó?

Đầu tiên chúng ta lấy một ví dụ thực tế trước nhé. Chúng ta có 3 lớp: Class Bus, Class Car, Class Truck.
Các phương thức fuelAmount(), capacity(), applyBrakes() đều có trong 3 lớp này. Khi đó, nếu chúng ta tạo các lớp này thì chúng ta phải viết trong mỗi lớp đều có 3 phương thức trên.

Tính Kế Thừa

Tồi tệ hơn chút nữa, nếu bạn muốn sửa lại code trong một phương thức nào đó, thì bạn phải sửa chúng cả ở 3 lớp. Sẽ rất tốn thời gian, và có thể dễ sai sót đúng không nào.

Vì thế để tránh điều này và cũng đảm bảo dữ liệu sẽ không bị dư thừa, tính kế thừa sẽ được sử dụng ở đây.

Khi áp dụng tính kế thừa, đầu tiên ta sẽ lại một lớp: Class Vehical. Trong lớp này sẽ có cả 3 phương thức fuelAmount(), capacity() và applyBrakes().
Sau đó chúng ta mới tạo 3 lớp: Class Bus, Class Car, Class Truck. Rồi cho 3 lớp này kế thừa từ lớp Class Vehical.

Tính Kế Thừa

Hình ảnh trên cho thấy khi áp dụng tính kế thừa, ta chỉ cần viết một lần các phương thức kia trong lớp cha và cho các lớp con kế thừa lại.

Điều này sẽ tránh việc sai sót khi sửa và tăng khả năng sử dụng lại.
Khả năng sử dụng lại ở đây là: Nếu bạn muốn thêm một lớp Class Taxi chẳng hạn, bạn chỉ cần khai báo nó kế thừa từ Class Vehical là cũng có thể dùng được 3 phương thức trên rồi.

Cú pháp sử dụng tính kế thừa

Cú pháp chung để khai báo kế thừa như sau:

Trong đó:

  • subclass_name là tên lớp con sẽ áp dụng kế thừa
  • base_class_name là tên lớp cha
  • access_mode có thể là public, private hoặc protected

Nếu các bạn không chỉ rõ access_mode thì mặc định sẽ là private.

Dưới đây là một ví dụ về sử dụng tính kế thừa trong C++.

Sau khi chạy chương trình ta có kết quả sau

Trong chương trình trên, class Child là lớp con, nó sẽ được kế thừa các thành viên dữ liệu dạng public từ class Parent
Nếu để các thành viên dữ liệu trên dạng private thì sẽ không thể dùng kế thừa
Bạn có thể xem lại các loại phạm vi truy cập: Tại đây

Các phạm vi kế thừa

Tiếp theo thì chúng ta sẽ tìm hiểu về các phạm vi kế thừa ( Access Mode ).
Ta sẽ có 3 loại chính đó là:

  1. public: Nếu kế thừa ở dạng này, sau khi kế thừa, tất cả các thành viên dạng public lớp cha sẽ public ở lớp con, dạng protected ở lớp cha vẫn sẽ là protected ở lớp con.
  2. protected: Nếu dùng protected thì sau khi kế thừa, tất cả các thành viên dạng public lớp cha sẽ trở thành protected tại lớp con.
  3. private: Trường hợp ta sử dụng private, thì sau khi kế thừa, tất cả các thành viên dạng publicprotected ở lớp cha sẽ thành private tại lớp con.

Bảng dưới đây sẽ tóm tắt các phạm vi kế thừa cho cả 3 loại public, protected, và private

Phạm Vi Truy Cập Tính Kế Thừa

Các loại kế thừa trong C++

Trong phần này, ta sẽ cùng tìm hiểu, ngôn ngữ C++ sẽ có các loại kế thừa nào nhé!

Đơn kế thừa (Single Inheritance)

Đơn kế thừa là gì?

Đơn kế thừa: nghĩa là một lớp chỉ được kế thừa từ đúng một lớp khác. Hay nói cách khác, lớp con chỉ có duy nhất một lớp cha.

Đơn Kế Thừa C++

Cú pháp khai báo đơn kế thừa

Đây là một ví dụ về đơn kế thừa

Sau khi biên dịch và chạy chương trình ta có kết quả

Đa kế thừa (Multiple Inheritance)

Định nghĩa

Đa kế thừa là một tính năng của ngôn ngữ C++. Trong đó một lớp có thể kế thừa từ nhiều hơn một lớp khác. Nghĩa là một lớp con được kế thừa từ nhiều hơn một lớp cơ sở.

Đa Kế Thừa C++

Cú pháp khai báo đa kế thừa

Ở đây, các lớp cơ sở sẽ được phân tách bằng dấu phẩy , và phạm vi truy cập cho mọi lớp cơ sở phải được chỉ định.

Chúng ta cùng xem ví dụ sau:

Sau khi chạy ta sẽ có kết quả sau

Lưu ý: Khi đa kế thừa cần tránh trường hợp có nhiều lớp cơ sở có tên phương thức giống nhau. Vì khi gọi từ lớp con thì chương trình không biết nên gọi phương thức đó từ lớp cơ sở nào.

Nếu bạn cần tìm hiểu rõ hơn về đa kế thừa. Bạn có thể truy cập: Tại đây

Kế thừa đa cấp (Multilevel Inheritance)

Định nghĩa

Kế thừa đa cấp: Trong kiểu thừa kế này, một lớp dẫn xuất được tạo từ một lớp dẫn xuất khác.

Kế Thừa Đa Cấp

Ví dụ về kế thừa đa cấp

Sau khi chạy ta có Output:

Kế thừa phân cấp (Hierarchical Inheritance)

Định nghĩa

Kế thừa phân cấp: Trong kiểu thừa kế này, sẽ có nhiều hơn một lớp con được kế thừa từ một lớp cha duy nhất.

Kế Thừa Phân Cấp C++

Ví dụ

Sau khi chạy ta có kết quả:

Kế thừa lai (Kế thừa ảo) – Hybrid (Virtual) Inheritance

Định nghĩa

Kế thừa lai (Kế thừa ảo): được thực hiện bằng cách kết hợp nhiều hơn một loại thừa kế. Ví dụ: Kết hợp kế thừa phân cấp và đa kế thừa.

Hình ảnh dưới đây cho thấy sự kết hợp của phân cấp và đa kế thừa:

Kế Thừa Lai (Ảo) trong C++

Ví dụ

Sau khi chạy ta có kết quả như sau:

Bài viêt của mình xin được kết thúc tại đây. Mình rất mong nhận được sự quan tâm, cũng như những góp ý từ các bạn để bài viết của mình ngày một hoàn thiện hơn. Cảm ơn tất cả mọi người. Xin chào và hẹn gặp lại.


Tài liệu tham khảo

  1. Geeksforgeeks
Các bài viết trong SeriesBài trước: Nạp Chồng Hàm Và Nạp Chồng Toán TửBài sau: Bài Tập C++ Về Tính Kế Thừa

3 COMMENTS

LEAVE A REPLY

Please enter your comment!
Please enter your name here