Kế thừa trong lập trình hướng đối tượng C++
1.3 INHERITANCE -Kế thừa
Các ngôn ngữ lập trình hướng đối tượng cho phép chúng ta tạo ra một hế thống phân cấp của các lớp để các đối tượng không phải là bản khởi tạo duy nhất của một lớp. Trước khi thảo luận về các vấn đề kế thừa, hay xem xét các định nghĩa lớp sau:
// Lớp cha
class Vehicle {
public:
string brand = "Ford";
void honk() {
cout << "Tuut, tuut! \n" ;
}
};
// Lớp con
class Car : public Vehicle {
public:
string model = "Mustang";
string brand = "Ferrari"
class Vinfast : public Car{
string brand = "Vinfast";
int price = 1000;
}
};
int main() {
Car myCar;
myCar.honk();
cout << myCar.brand + " " + myCar.model;
return 0;
}
Lớp Vehicle
được gọi là lớp cơ cha hoặc lớp siêu cấp, và các lớp khác được gọi là lớp con hoặc các lớp có nguồn gốc gới vì chúng có nguồn gốc từ lớp cha trong đó chúng có thể sử dụng các thành viên dữ liệu và các hàm thành viên được chỉ định trong lớp Vehicle
như là protected
hoặc public
. Chúng được kế thừa tất cả thành viên từ lớp cha do đó chúng không cần định nghĩa lại giống như vậy. Tuy nhiên, một lớp con có thể ghi đè định nghĩa của một hàm thành viên với định nghĩa riêng của nó. Trong cách này, cả hai lớp cha và lớp con đều có mọt số biện pháp kiểm soát các hàm thành viên.
Lớp cha có thể quyết định các hàm thành viên và dữ liệu thành viên có thể được chia sẽ cho các lớp con để nguyên tắc ân thông tin không chỉ tuân theo đối với người sử dụng lớp cha, mà còn đối với các lớp con. Hơn thế nữa, các lớp con có thể quyết định các phần công khai của hàm thành viên và dữ liệu để giữ lại và sử dụng và để sửa đổi. Ví dụ. lớp con Car
được kế thừa từ lớp cha Vehicle
được kế thừa các thuộc tính và phương thức của lớp cha, tuy nhiên, lớp Car
có thể sửa đổi thuộc tính của lớp Vehicle
theo cách riêng của mình.
Một lớp con có thể thêm một vài thành viên mới của nó. Như vậy một lớp có thể trở thành một lớp cha khác cho các lớp con khác kế thừa theo hệ thống cấp bậc kéo dài đa thế hệ. Ví dụ, lớp Car
là lớp con của lớp Vehicle
, nhưng lớp Car
lại là lớp cha của lớp Vinfast
.
Sự kế thừa trong các ví dụ của chúng tôi được chỉ định bằng sách sử dụng từ public sau dấu hai chấm trong tiêu đề địng nghĩa của lớp con. Kế thừa công khai có nghĩa là các thành viên trong lớp cha cũng là công khai trong lớp con và các thành viên bảo vệ cũng được bảo vệ. Trong trường hợp kế thừa được bảo vệ (với từ protected trong mệnh đề định nghĩa), cả hai thành viên công khai và bảo vệ trong lớp cha cũng sẽ được bảo vệ trong lớp con. Cuối cùng đối với kế thừa riêng, cả thành viên công khai và bảo vệ của lớp cha đều trở thành riêng tư trong lớp con. Trong tất cả các loại kế thừa, các thành viên riêng tư của lớp cha không thể nào truy cập được từ bất kì lớp con nào. Các thành viên được bảo vệ trong lớp cha chỉ có thể truy cập được từ lớp con và không phải từ các lớp con khác.
Trong C++, có 3 kiểu truy cập: public: Các thành viên có thể truy cập từ bên ngoài class. private: Các thành viên không thể truy cập (hoặc xem) từ bên ngoài class. protected: Các thành viên không thể truy cập từ bên ngoài class, tuy nhiên chúng có thể được truy cập từ các class kế thừa.