Tính kế thừa trong C++ | Cách sử dụng tính kế thừa trong ngôn ngữ C++

This entry is part 7 of 10 in the series This entry is part 7 of 10 in the series Hướng đối tượng người tiêu dùng C + +Xin chào tổng thể mọi người, mình quay lại rồi đây. Thời gian vừa qua mình khá bận nên không có thời hạn san sẻ tiếp với mọi người. Và ngày hôm nay tất cả chúng ta liên tục tới phần tiếp theo là tính thừa kế trong lập trình hướng đối tượng người tiêu dù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 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.

Tính Kế Thừa

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à:

  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 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 .

Đơn Kế Thừa C++

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ở .

Đa Kế Thừa C++

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 .

Kế Thừa Đa Cấp

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 .

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

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ế :

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

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