2015-10-06 30 views
5

lớp cơ sở ảo được khởi tạo trong lớp có nguồn gốc nhất, vì vậy tôi đoán là kế thừa các nhà xây dựng của lớp cơ sở nên làm việc cũng như:nhà xây dựng Kế thừa các lớp cơ sở ảo

struct base { 
    base(int) {} 
}; 

struct derived: virtual base { 
    using base::base; 
}; 

derived d(0); 

Tuy nhiên, đây không biên dịch với GCC 5.2.0, cố gắng tìm base::base(), nhưng hoạt động tốt với Clang 3.6.2. Đây có phải là lỗi trong GCC không?

+3

liên quan: http://stackoverflow.com/questions/2126522/c-virtual-inheritance – SingerOfTheFall

Trả lời

5

Đây là lỗi gcc 58751 "[C++ 11] Kế thừa nhà xây dựng không hoạt động đúng với thừa kế ảo" (aka: 63339 "sử dụng nhà xây dựng" từ các căn cứ ảo được ngầm xóa "):

Từ 58.751 Mô tả:

Trong tài liệu N2540 nó nói rằng:

Thông thường, các định nghĩa hàm tạo kế thừa cho các lớp với các cơ sở ảo sẽ bị hỏng, trừ khi cơ sở ảo hỗ trợ khởi tạo mặc định hoặc cơ sở ảo là cơ sở trực tiếp và được đặt tên làm cơ sở được chuyển tiếp. Tương tự như vậy, tất cả các thành viên dữ liệu và các cơ sở trực tiếp khác phải hỗ trợ khởi tạo mặc định, hoặc bất kỳ nỗ lực nào để sử dụng một hàm tạo kế thừa sẽ bị hình thành không đúng. Lưu ý: hình thành không đúng khi được sử dụng, không được khai báo.

Do đó, trường hợp cơ sở ảo được ủy ban xem xét rõ ràng và do đó cần được triển khai.

Giải pháp vay mượn từ các báo cáo lỗi:

struct base { 
    base() = default; // <--- add this 
    base(int) {} 
}; 

Theo báo cáo lỗi, trong trường hợp này các nhà xây dựng base::base(int) được gọi bởi các nhà xây dựng ngầm được tạo ra derived::derived(int).

Tôi đã kiểm tra xem your code không biên dịch hay không. Nhưng this thực hiện và gọi phương thức khởi tạo là base::base(int).

+0

Tất nhiên điều này vẫn không hoạt động nếu 'cơ sở' không thể được xây dựng mặc định ... Vì vậy, nó xuất hiện rằng cách duy nhất xung quanh điều này là tự xác định lại các hàm tạo trong tất cả các lớp dẫn xuất. –

Các vấn đề liên quan