xem xét mãNhiều thừa kế cơ sở nhập nhằng lớp
struct Base{};
struct Derived: public Base{};
struct A: public Base{};
struct B: public A, public Base{};
struct C: public A, public Derived{}; // why no ambiguity here?
int main() {}
Trình biên dịch (g ++ 5.1) cảnh báo rằng
cảnh báo: cơ sở trực tiếp
'Base'
không thể tiếp cận trong'B'
do sự nhập nhằngstruct B: public A, public Base{};
Tôi hiểu điều này, Base
được nhân đôi trong B
.
Tại sao không có cảnh báo cho
C
? KhôngC
được kế thừa từ cả hai sốA
vàDerived
, cả hai đều được kế thừa từBase
?Tại sao thêm
virtual
struct Derived: virtual Base{};
kết quả bây giờ trong cả B
và C
cảnh báo phát ra, sống trên Wandbox
cảnh báo: cơ sở trực tiếp
'Base'
không thể tiếp cận trong'B'
do sự nhập nhằngstruct B: public A, public Base{};
cảnh báo: cơ sở trực tiếp
'Base'
không thể tiếp cận trong'C'
do sự nhập nhằngstruct C: public A, public Derived{};
Tìm kiếm Internet cho "thừa kế kim cương đáng sợ". –
@ThomasMatthews Tôi biết vấn đề kim cương là gì và liên quan chặt chẽ đến lý do tại sao 'B' đưa ra cảnh báo. Tuy nhiên những gì tôi không hiểu là tại sao 'C' là OK. – vsoftco
Tôi nghĩ rằng nó chỉ là một trường hợp của gcc không phát hiện sự mơ hồ trong 'C' vì' Base' * là * mơ hồ trong trường hợp đó quá.Khi bạn hầu như xuất phát từ 'Base', lớp dẫn xuất nhất (' C') chịu trách nhiệm gọi hàm tạo 'Base', và vì vậy gcc bắt đầu phát hiện sự mơ hồ một lần nữa. – Praetorian