Trong ngôn ngữ lập trình C++, kế thừa là một khái niệm quan trọng trong hướng đối tượng, cho phép bạn tạo ra các lớp mới dựa trên các lớp đã tồn tại. Kế thừa giúp tái sử dụng mã nguồn và tạo ra các cấu trúc phân cấp trong chương trình. C++ hỗ trợ các loại kế thừa khác nhau như kế thừa công khai, kế thừa bảo mật và kế thừa đa hình. Trong bài viết này, chúng ta sẽ tìm hiểu về các loại kế thừa này trong C++.
- Kế thừa công khai (Public inheritance): Kế thừa công khai là loại kế thừa phổ biến nhất trong C++. Khi một lớp được kế thừa công khai từ một lớp khác, các thành phần công khai và bảo mật được kế thừa đều giữ nguyên tính chất của chúng. Điều này có nghĩa là các thành viên công khai vẫn là công khai trong lớp dẫn xuất và các thành viên bảo mật vẫn là bảo mật. Ví dụ:
class A {
public:
int publicMember;
private:
int privateMember;
protected:
int protectedMember;
};
class B : public A {
// B kế thừa công khai từ A
};
int main() {
B obj;
obj.publicMember = 10; // OK
obj.privateMember = 10; // Lỗi - privateMember là thành viên riêng tư của lớp A
obj.protectedMember = 10; // Lỗi - protectedMember là thành viên bảo mật của lớp A
return 0;
}
- Kế thừa bảo mật (Protected inheritance): Kế thừa bảo mật là loại kế thừa mà các thành viên công khai của lớp cơ sở trở thành thành viên bảo mật của lớp dẫn xuất. Điều này có nghĩa là các thành viên công khai của lớp cơ sở không thể truy cập trực tiếp từ lớp dẫn xuất, nhưng có thể truy cập thông qua các thành viên thành viên bảo mật hoặc thành viên công khai trong lớp dẫn xuất. Ví dụ:
class A
{
public:
int publicMember;
private:
int privateMember;
protected:
int protectedMember;
};
class B : protected A {
// B kế thừa bảo mật từ A
};
int main() {
B obj;
obj.publicMember = 10; // Lỗi - publicMember là thành viên bảo mật của lớp B
obj.privateMember = 10; // Lỗi - privateMember là thành viên riêng tư của lớp A
obj.protectedMember = 10; // Lỗi - protectedMember là thành viên bảo mật của lớp B
return 0;
}
- Kế thừa đa hình (Virtual inheritance): Kế thừa đa hình cho phép bạn xây dựng một cấu trúc phân cấp có nhiều lớp dẫn xuất từ một lớp cơ sở chung. Khi sử dụng kế thừa đa hình, các đối tượng dẫn xuất chỉ chứa một bản sao của lớp cơ sở chung, thay vì chứa nhiều bản sao như trong kế thừa thông thường. Điều này giúp giảm bộ nhớ và xử lý đa hình một cách hiệu quả. Ví dụ:
class A {
public:
int data;
};
class B : virtual public A {
// B kế thừa đa hình từ A
};
class C : virtual public A {
// C kế thừa đa hình từ A
};
class D : public B, public C {
// D kế thừa từ B và C
};
int main() {
D obj;
obj.data = 10; // OK - data là thành viên chung của các lớp B, C và A
return 0;
}
Trên đây là một số loại kế thừa phổ biến trong ngôn ngữ lập trình C++. Việc hiểu và áp dụng chúng sẽ giúp bạn xây dựng các cấu trúc phân cấp mạnh mẽ và dễ bảo trì trong chương trình của mình.