Khái niệm kế thừa và đơn kế thừa trong 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().

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

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ậpPublicProtectedPrivateTrong cùng lớpCóCóCóLớp kế thừaCóCóKhôngBên ngoài lớpCóKhôngKhông

5/5 – (1 bình chọn)