Tóm Tắt
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ồi tệ hơn chút nữa, nếu bạn muốn sửa lại code trong một phương pháp nào đó, thì bạn phải sửa chúng cả ở 3 lớp. Sẽ rất tốn thời hạn, và hoàn toàn có thể dễ sai sót đúng không nào .
Vì thế để tránh điều này và cũng bảo vệ tài liệu sẽ không bị dư thừa, tính thừa kế 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
.
Hình ảnh trên cho thấy khi vận dụng tính thừa kế, ta chỉ cần viết một lần những phương pháp kia trong lớp cha và cho những lớp con thừa kế 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 thừa kế như sau :
012345 |
classsubclass_name:access_modebase_class_name { / / body toàn thân of subclass }; |
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 những 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 thừa kế trong C + + .
012345678910111213141516171819202122232425 |
#include usingnamespacestd; / / Lớp Cha classParent{ public: intid_p; }; / / Lớp con thừa kế từ lớp cha classChild:publicParent{ public: intid_c; }; intmain(){ Childobj1; obj1.id_c=7; obj1.id_p=91; cout<<" Child id is "< cout<<" Parent id is "< return0; } |
Sau khi chạy chương trình ta có tác dụng sau
0123 | Child id is 7Parent id is 91 |
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à:
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ạngpublic
lớp cha sẽpublic
ở lớp con, dạngprotected
ở lớp cha vẫn sẽ làprotected
ở lớp con.protected
: Nếu dùngprotected
thì sau khi kế thừa, tất cả các thành viên dạngpublic
lớp cha sẽ trở thànhprotected
tại lớp con.private
: Trường hợp ta sử dụngprivate
, thì sau khi kế thừa, tất cả các thành viên dạngpublic
vàprotected
ở lớp cha sẽ thànhprivate
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
Các loại kế thừa trong C++
Trong phần này, ta sẽ cùng khám phá, ngôn từ C + + sẽ có những loại thừa kế nào nhé !
Đơn kế thừa (Single Inheritance)
Đơn kế thừa là gì?
Đơn thừa kế : 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 .
Cú pháp khai báo đơn kế thừa
012345 |
classsubclass_name:access_modebase_class { / / body toàn thân of subclass }; |
Đây là một ví dụ về đơn thừa kế
0123456789101112131415161718192021222324252627 |
#include usingnamespacestd; / / Lớp cha classVehicle { public: Vehicle() { cout<<" This is a Vehicle "< } }; / / Lớp con thừa kế từ lớp cha classCar:publicVehicle { }; / / main function intmain() { / / creating object of sub class will / / invoke the constructor of base classes Carobj; return0; } |
Sau khi biên dịch và chạy chương trình ta có tác dụng
012 | This is a vehicle |
Đa kế thừa (Multiple Inheritance)
Định nghĩa
Đa thừa kế là một tính năng của ngôn từ C + +. Trong đó một lớp hoàn toàn có thể thừa kế từ nhiều hơn một lớp khác. Nghĩa là một lớp con được thừa kế từ nhiều hơn một lớp cơ sở .
Cú pháp khai báo đa kế thừa
012345 |
classsubclass_name:access_modebase_class1,access_modebase_class2,…. { / / body toàn thân of subclass }; |
Ở đâ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 :
01234567891011121314151617181920212223242526272829303132333435 |
#include usingnamespacestd; / / Lớp cơ sở thứ nhất classVehicle { public: Vehicle() { cout<<" This is a Vehicle "< } }; / / Lớp cơ sở thứ hai classFourWheeler { public: FourWheeler() { cout<<" This is a 4 wheeler Vehicle "< } }; / / Lớp con thừa kế từ 2 lớp cha classCar:publicVehicle,publicFourWheeler { }; / / main function intmain() { Carobj; return0; } |
Sau khi chạy ta sẽ có hiệu quả sau
0123 | This is a VehicleThis is a 4 wheeler Vehicle |
Lưu ý : Khi đa thừa kế cần tránh trường hợp có nhiều lớp cơ sở có tên phương pháp 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 pháp đó từ lớp cơ sở nào .
Nếu bạn cần tìm hiểu và khám phá rõ hơn về đa thừa kế. Bạn hoàn toàn có thể truy vấn : 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 .
Ví dụ về kế thừa đa cấp
01234567891011121314151617181920212223242526272829303132333435363738 |
#include usingnamespacestd; / / Lớp cha classVehicle { public: Vehicle() { cout<<" This is a Vehicle "< } }; / / Lớp con thừa kế từ lớp cha classfourWheeler:publicVehicle { public: fourWheeler() { cout<<" Objects with 4 wheels are vehicles "< } }; / / Lớp con thừa kế từ lớp cha thứ 2 classCar:publicfourWheeler { public: car() { cout<<" Car has 4 Wheels "< } }; / / main function intmain() { Carobj; return0; } |
Sau khi chạy ta có Output :
01234 | This is a VehicleObjects with 4 wheels are vehiclesCar has 4 Wheels |
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 .
Ví dụ
012345678910111213141516171819202122232425262728293031 |
#include usingnamespacestd; / / Lớp cha classVehicle { public: Vehicle() { cout<<" This is a Vehicle "< } }; / / Lớp con thứ nhất classCar:publicVehicle { }; / / Lớp con thứ hai classBus:publicVehicle { }; / / main function intmain() { Carobj1; Busobj2; return0; } |
Sau khi chạy ta có tác dụng :
0123 | This is a VehicleThis is a Vehicle |
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 thi bằng cách tích hợp nhiều hơn một loại thừa kế. Ví dụ : Kết hợp thừa kế phân cấp và đa thừa kế .
Hình ảnh dưới đây cho thấy sự tích hợp của phân cấp và đa thừa kế :
Ví dụ
012345678910111213141516171819202122232425262728293031323334353637383940 |
#include usingnamespacestd; / / Lớp cha classVehicle { public: Vehicle() { cout<<" This is a Vehicle "< } }; / / Lớp cha classFare { public: Fare() { cout<<" Fare of Vehicle \ n "; } }; / / Lớp con thứ nhất classCar:publicVehicle { }; / / Lớp con thứ hai classBus:publicVehicle,publicFare { }; / / main function intmain() { Busobj2; return0; } |
Sau khi chạy ta có tác dụng như sau :
0123 | This is a VehicleFare of Vehicle
|
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ự chăm sóc, cũng như những góp ý từ những bạn để bài viết của mình ngày một hoàn thành xong hơn. Cảm ơn tổng thể mọi người. Xin chào và hẹn gặp lại .
Tài liệu tìm hiểu thêm
Source: https://final-blade.com
Category: Kiến thức Internet