Giả sử tôi có một tình huống thừa kế kim cương như sau:Tại sao lớp sau có bảng ảo?
class A{
public: virtual void foo(){};
};
class B: public virtual A{
public: virtual void foo(){};
};
class C: public virtual A{
public: virtual void foo(){};
};
class D: B, C{};
Dòng cuối cùng mang lại một lỗi biên dịch với lý do mơ hồ. Như tôi đã hiểu, vấn đề là trình biên dịch không biết foo nào đặt trong vtbl của D, nhưng tại sao lại có một vtbl cho D nếu nó không định nghĩa bất kỳ chức năng ảo nào của nó?
Có phải "ảo" làm trình chỉ định mức bảo vệ thậm chí hợp lệ trên các dòng khai báo lớp của bạn (ví dụ: lớp B: virtual A) không? – Joe
Nó không có bộ định danh bảo vệ. Nó biểu thị một lớp cơ sở ảo, đó là loại hack hợp pháp để giải quyết vấn đề kim cương. –
Ah, phải, cảm ơn bạn. – Joe