Trang tài liệu
Khóa học C++ nền tảng
Chương 8. Cấu trúc và lớp
Kế thừa kim cương

Kế thừa kim cương

Kế thừa kim cương là một kịch bản cụ thể trong đa kế thừa trong đó một lớp được dẫn xuất từ hai hoặc nhiều lớp, do đó, được dẫn xuất từ một lớp cơ sở chung. Nó tạo ra sự mơ hồ phát sinh từ việc sao chép lớp cơ sở chung, dẫn đến hành vi mơ hồ trong khi gọi các thành viên trùng lặp.

Để giải quyết sự mơ hồ này, bạn có thể sử dụng kế thừa ảo. Một lớp cơ sở ảo là một lớp được chia sẻ bởi nhiều lớp sử dụng từ khóa virtual trong C++. Điều này đảm bảo rằng chỉ một bản sao của lớp cơ sở được kế thừa trong lớp dẫn xuất cuối cùng và do đó, giải quyết được vấn đề thừa kế kim cương.

Ví dụ:

#include<iostream>
using namespace std;

class Base {
public:
    void print() {
        cout << "Base class" << endl;
    }
};

class Derived1 : virtual public Base {
public:
    void derived1Print() {
        cout << "Derived1 class" << endl;
    }
};

class Derived2 : virtual public Base {
public:
    void derived2Print() {
        cout << "Derived2 class" << endl;
    }
};

class Derived3 : public Derived1, public Derived2 {
public:
    void derived3Print() {
        cout << "Derived3 class" << endl;
    }
};

int main()
{
    Derived3 d3;
    d3.print(); // Bây giờ, không có sự mơ hồ nào trong việc gọi hàm lớp cơ sở
    d3.derived1Print();
    d3.derived2Print();
    d3.derived3Print();

    return 0;
}

Trong đoạn mã code trên, Derived1 và Derived2 được dẫn xuất từ lớp base bằng cách sử dụng kế thừa ảo. Vì vậy, khi chúng ta tạo một đối tượng Derived3 và gọi hàm print() từ lớp base, sẽ không có sự mơ hồ nào và mã sẽ thực thi mà không gặp bất kỳ sự cố nào.