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