Khái niệm kế thừa và đơn kế thừa trong lập trình hướng đối tượng

Đây là bài 12/19 bài của series môn học Lập trình hướng đối tượng

1. Khái niệm kế thừa (Inheritance)

Tính kế thừa cho phép định nghĩa các lớp mới (lớp dẫn xuất – derived class) từ các lớp đã có (lớp cơ sở – base class). Kế thừa nhằm tái sử dụng lại mã chương trình.

Một lớp có thể là lớp cơ sở cho nhiều lớp dẫn xuất khác nhau. Lớp dẫn xuất sẽ kế thừa một số thành phần (dữ liệu và hàm) của lớp cơ sở, đồng thời lớp dẫn xuất có thêm những thành phần mới.

Ví dụ, lớp Dog kế thừa từ lớp Animal như bên dưới.

class Animal {
    // eat() function
    // sleep() function
};

class Dog : public Animal {
    // bark() function
};

Lớp Dog có thể kế thừa hàm eat() và hàm sleep() từ lớp Animal. Lớp Dog còn có thêm hàm bark().

Inheritance in OOP

Kế thừa thể hiện mối quan hệ is-a (is-a relationship) giữa các lớp. Ví dụ:

    • Nếu lớp Car kế thừa từ lớp Vehicle thì một car là một vehicle.
    • Nếu lớp Orange kế thừa từ lớp Fruit thì một orange là một fruit.
    • Nếu lớp Dog kế thừa từ lớp Animal thì một dog là một animal.

2. Đơn kế thừa (Single Inheritance) trong C++

Đơn kế thừa trong C++ là một lớp dẫn xuất được kế thừa từ một và chỉ một lớp cơ sở.

Inheritance in OOP

Cú pháp khai báo một lớp kế thừa từ một lớp khác như sau:

class <Tên_lớp_dẫn_xuất> : <Từ_khóa_dẫn_xuất> <Tên_lớp_cơ_sở>{
private:
	// Khai báo các thuộc tính của lớp_dẫn_xuất
public:
	// Định nghĩa các hàm thành phần của lớp_dẫn_xuất
};

Trong đó, <Từ_khóa_dẫn_xuất> có thể là public, private, protected:

Dẫn xuất public quy định phạm vi truy nhập như sau:

− Các thành phần private của lớp cơ sở thì không thể truy cập từ lớp dẫn xuất.

− Các thành phần public của lớp cơ sở trở thành các thành phần public của lớp dẫn xuất.

Dẫn xuất private quy định phạm vi truy nhập như sau:

− Các thành phần private của lớp cơ sở thì không thể truy cập từ lớp dẫn xuất.

− Các thành phần public của lớp cơ sở trở thành các thành phần private của lớp dẫn xuất.

Xem tiếp phần 3 để biết đặc điểm của dẫn xuất protected.

3. Từ khóa dẫn xuất protected

Giống với các thành phần private, các thành phần protected không thể được truy cập bên ngoài lớp. Tuy nhiên, chúng có thể được truy cập bởi lớp dẫn xuất (derived class).

Khi chúng ta muốn che giấu dữ liệu trong lớp nhưng vẫn muốn dữ liệu được kế thừa bởi lớp dẫn xuất thì chúng ta sẽ sử dụng protected.

Ví dụ:
class Animal{
private:
    string color;
protected:
    string type;
public:
    void eat() {
        cout << "I can eat!" << endl;
    }

    void sleep() {
        cout << "I can sleep!" << endl;
    }
};

Khi kế thừa theo kiểu public thì các thành phần proteted của lớp cơ sở sẽ trở thành các thành phần protected của lớp dẫn xuất.

Kế thừa theo kiểu private thì các thành phần proteted của lớp cơ sở sẽ trở thành các thành phần private của lớp dẫn xuất.

Chúng ta cũng có từ khóa dẫn xuất protected. Ví dụ như bên dưới:

class Dog : protected Animal {...};

Dẫn xuất protected quy định phạm vi truy nhập như sau:

− Các thành phần private của lớp cơ sở thì không thể truy cập được từ lớp dẫn xuất protected.

− Các thành phần protected của lớp cơ sở trở thành các thành phần protected của lớp dẫn xuất.

− Các thành phần public của lớp cơ sở cũng trở thành các thành phần protected của lớp dẫn xuất.

Bảng tóm tắt phạm vi truy cập của từ khóa dẫn xuất bên dưới.

Truy cậpPublicProtectedPrivate
Trong cùng lớp
Lớp kế thừaKhông
Bên ngoài lớpKhôngKhông
5/5 - (1 bình chọn)
Bài trước và bài sau trong môn học<< Nạp chồng toán tử (operator overloading) trong C++Dẫn xuất public, protected, private trong kế thừa và minh họa với C++ >>
Chia sẻ trên mạng xã hội:

Trả lời

Lưu ý:

1) Vui lòng bình luận bằng tiếng Việt có dấu.

2) Khuyến khích sử dụng tên thật và địa chỉ email chính xác.

3) Mọi bình luận trái quy định sẽ bị xóa bỏ.