Tôi có một phân cấp hình kim cương của các lớp, trong đó không có hàm tạo mặc định, cũng không phải các hàm tạo bản sao. Hai nhà xây dựng Tôi có là một "di chuyển" một và khác mà phải mất một tài liệu tham khảo giá trị trái đến một đối tượng:Làm thế nào để thực hiện một hàm tạo di chuyển cho một thừa kế hình kim cương?
struct base {
base(base&&) = default;
base(member_type&& m): member_(std::move(m)) {}
member_type member_;
};
struct virt_1: virtual base {
virt_1(virt_1&& rhs): base(std::move(rhs)) {}
virt_1(member_type&& m): base(std::move(m)) {}
};
struct virt_2: virtual base {
virt_2(virt_2&& rhs): base(std::move(rhs)) {}
virt_2(member_type&& m): base(std::move(m)) {}
};
struct concrete: virt_1, virt_2 {
concrete(concrete&& rhs) // ???
};
Bên cạnh đó không sử dụng một hệ thống phân cấp kim cương hình, là nó có thể để thực hiện các constructor di chuyển cho lớp bê tông ?
Cảm ơn!
Âm báo rất dễ xảy ra với tôi. Hàm khởi tạo của cơ sở ảo được gọi từ lớp dẫn xuất nhất, và sẽ không có lý do gì mà nó không thể gọi một hàm khởi tạo (move constructor). Nhưng bất kỳ dẫn xuất xa hơn, và có một cơ hội tốt một người nào đó sẽ quên nó, hoặc làm điều đó sai. Theo nguyên tắc chung, các lớp cơ sở ảo không được chứa dữ liệu hoặc ít nhất có bất kỳ hàm tạo nào khác với một hàm tạo mặc định, để tránh các vấn đề như vậy. –
@ JamesKanze Tôi biết rõ rằng 'cơ sở' không nên chứa dữ liệu, hoặc ít nhất có một hàm tạo mặc định, nhưng nó không thể là trường hợp trong ngữ cảnh của tôi. Tuy nhiên, có cơ hội nào mà trình biên dịch sẽ phàn nàn nếu ai đó quên gọi hàm tạo cơ sở ảo khi phát sinh thêm? – piwi
@piwi, không, không có cơ hội, bởi vì 'base' không có hàm tạo mặc định, vì vậy loại có nguồn gốc cao nhất ** phải ** xây dựng nó rõ ràng –