Categories: Tài liệu IT

Dẫn xuất public, protected, private trong kế thừa và minh họa với C++

Published by

Kế thừa trong lập trình hướng đối tượng cho phép chúng ta tái sử dụng mã nguồn và xây dựng các lớp con dựa trên các lớp cha. Khi kế thừa, chúng ta có thể sử dụng các dẫn xuất khác nhau như public, protected, và private. Hãy tìm hiểu về cách các dẫn xuất này hoạt động trong C++.

1. Tính kế thừa với các dẫn xuất public, protected, private trong C++

Kế thừa public có đặc điểm:

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

Kế thừa protected có đặc điểm:

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

Kế thừa private có đặc điểm:

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

Lưu ý: Các thành phần private của lớp cơ sở luôn không thể truy cập trong lớp dẫn xuất.

2. Ví dụ kế thừa với dẫn xuất public

#include <iostream>
using namespace std;

class Base {
private:
    int pvt = 1;
protected:
    int prot = 2;
public:
    int pub = 3;

    // function to access private member
    int getPVT() {
        return pvt;
    }
};

class PublicDerived : public Base {
public:
    // function to access protected member from Base
    int getProt() {
        return prot;
    }
};

int main() {
    PublicDerived object1;
    cout << "Private = " << object1.getPVT() << endl;
    cout << "Protected = " << object1.getProt() << endl;
    cout << "Public = " << object1.pub << endl;
    return 0;
}

Kết quả:
Private = 1
Protected = 2
Public = 3

Lớp PublicDerived kế thừa public từ lớp Base. Khi đó, prot trở thành thành phần protected, pub và getPVT() trở thành thành phần public của lớp PublicDerived. pvt không được truy cập trong lớp PublicDerive bởi nó là thành phần private trong lớp Base.

Các thành phần private và protected của lớp không thể truy cập trong hàm main(). Chúng ta cần tạo các hàm public là getPVT() và getProt() để truy cập chúng.

Lưu ý: Hàm getPVT() được định nghĩa trong lớp Base còn hàm getProt() được định nghĩa trong lớp PublicDerived.

pvt là thành phần private trong Base và không thể truy cập trong PublicDerived. Các đối tượng của lớp PublicDerived chỉ có thể truy cập pvt thông qua hàm getPVT() được định nghĩa trong lớp Base và được kế thừa qua cho lớp PublicDerived.

prot có thể được truy cập bởi lớp PublicDerived vì kế thừa với dẫn xuất public. Vì thế, hàm getProt() có thể truy cập biến protected prot trong PublicDerived.

3. Ví dụ kế thừa với dẫn xuất protected

#include <iostream>
using namespace std;

class Base {
private:
    int pvt = 1;
protected:
    int prot = 2;
public:
    int pub = 3;

    // function to access private member
    int getPVT() {
        return pvt;
    }
};

class ProtectedDerived : protected Base {
public:
    // function to access protected member from Base
    int getProt() {
        return prot;
    }

    // function to access public member from Base
    int getPub() {
        return pub;
    }
};

int main() {
    ProtectedDerived object1;
    cout << "Private cannot be accessed." << endl;
    cout << "Protected = " << object1.getProt() << endl;
    cout << "Public = " << object1.getPub() << endl;
    return 0;
}

Kết quả:
Private cannot be accessed.
Protected = 2
Public = 3

Lớp ProtectedDerived kế thừa protected từ lớp Base. Khi đó, lớp ProtectedDerived sẽ có:

  • prot, pub và getPVT() là thành phần protected.
  • pvt không thể truy cập được. Hàm getPVT() không thể được sử dụng bên ngoài lớp ProtectedDerived. Trong ví dụ trên là không thể sử dụng trong hàm main() bởi các đối tượng của lớp ProtectedDerived được.

Đó cũng là lý do cần tạo hàm getPub() để truy cập biến pub trong lớp ProtectedDerived.

4. Ví dụ kế thừa với dẫn xuất private

#include <iostream>
using namespace std;

class Base {
private:
    int pvt = 1;
protected:
    int prot = 2;
public:
    int pub = 3;

    // function to access private member
    int getPVT() {
        return pvt;
    }
};

class PrivateDerived : private Base {
public:
    // function to access protected member from Base
    int getProt() {
        return prot;
    }

    // function to access private member
    int getPub() {
        return pub;
    }
};

int main() {
    PrivateDerived object1;
    cout << "Private cannot be accessed." << endl;
    cout << "Protected = " << object1.getProt() << endl;
    cout << "Public = " << object1.getPub() << endl;
    return 0;
}

Kết quả:
Private cannot be accessed.
Protected = 2
Public = 3

Lớp PrivateDerived kế thừa private từ lớp Base. Khi đó, lớp PrivateDerived sẽ có:

  • prot, pub và getPVT() là thành phần private.
  • pvt không thể truy cập được. Hàm getPVT() không thể được sử dụng bên ngoài lớp PrivateDerived. Trong ví dụ trên là không thể sử dụng trong hàm main() bởi các đối tượng của lớp PrivateDerived được.

Đó cũng là lý do cần tạo hàm getPub() để truy cập biến pub trong lớp PrivateDerived.

Tài liệu tham khảo: C++ Public, Protected and Private Inheritance.

This post was last modified on Tháng Năm 2, 2024 2:57 chiều

Đinh Thái Hoàng

Đinh Thái Hoàng - tác giả của Laptrinhc.edu.vn, chuyên sâu trong lĩnh vực lập trình. Trang web chia sẻ kiến thức, hướng dẫn và tin tức về lập trình, giúp bạn khám phá thế giới mã nguồn và nâng cao kỹ năng coder.

Published by

Bài đăng mới nhất

Ngành Công Nghệ Ô Tô – Động Lực Cho Tương Lai Kinh Tế

Ngành Công Nghệ Ô Tô – Động Lực Cho Tương Lai Kinh Tế

Ngành công nghệ ô tô là gì? Đây là một trong những lĩnh vực đang…

8 giờ ago

Hướng dẫn tự học thiết kế website miễn phí cho người mới

Hiện nay, trong thời đại số, việc thiết kế website đã trở nên vô cùng…

8 giờ ago

List 20 câu hỏi phỏng vấn Javascript thường gặp nhất

JavaScript là một trong những ngôn ngữ lập trình phổ biến nhất thế giới. Đối…

9 giờ ago

Tư vấn thiết kế website chuyên nghiệp từ A 🡪 Z (Mọi mảng)

Để lựa chọn một đơn vị thiết kế website uy tín trong số hàng ngàn…

9 giờ ago

Mẫu web bán hàng: Tạo ra Trang web Bán hàng Chuyên nghiệp và Hấp dẫn

Bạn đang muốn tạo ra một trang web bán hàng chuyên nghiệp để mở rộng…

9 giờ ago

Tìm hiểu về toán học và lập trình

Bạn có tự hỏi tại sao một bài viết về Machine Learning, Deep Learning lại…

9 giờ ago