Diamond problem xảy ra khi class D kế thừa từ B và C, cả hai đều kế thừa từ A.
Kết quả: D có 2 bản sao của A, gây nhập nhằng.
A
/ \
B C
\ /
Dcpp
class A { public: int x; };
class B : public A {};
class C : public A {};
class D : public B, public C {};
D d;
// d.x; // lỗi: ambiguous — B::x hay C::x?Giải pháp: virtual inheritance — A chỉ tồn tại 1 lần trong D.
cpp
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {};
D d;
d.x = 5; // OK — chỉ có một A::x duy nhấtVirtual inheritance tốn thêm overhead (thêm vptr); thường nên tránh diamond bằng cách thiết kế lại (dùng interface/composition).