Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Virtual base class (lớp cơ sở ảo) trong C++


Virtual base class giải quyết vấn đề đa kế thừa kim cương (diamond problem): khi lớp dẫn xuất kế thừa gián tiếp cùng một lớp cơ sở qua nhiều đường, sẽ có nhiều bản sao của lớp cơ sở. Dùng virtual khi kế thừa lớp cơ sở để chỉ giữ một bản sao chung.

Vấn đề không dùng virtual

class B { public: int b; };
class D1 : public B { public: int d1; };
class D2 : public B { public: int d2; };
class D3 : public D1, public D2 { public: int d3; };
// D3 có 2 bản sao B -> obj.b gây ambiguous

Giải pháp: virtual base class

class B { public: int b; };
class D1 : virtual public B { public: int d1; };
class D2 : virtual public B { public: int d2; };
class D3 : public D1, public D2 { public: int d3; };

int main() {
    D3 obj;
    obj.b = 40; // OK, chỉ 1 bản sao B
    obj.b = 30; // Ghi đè giá trị trước
    obj.d1 = 60; obj.d2 = 70; obj.d3 = 80;
    cout << "B:" << obj.b << " D1:" << obj.d1 << " D2:" << obj.d2 << " D3:" << obj.d3;
}

Kết quả

B:30 D1:60 D2:70 D3:80