Mam hierarchiczną hierarchię klas, gdzie nie ma domyślnego konstruktora, ani nie kopiuję konstruktorów. Dwaj konstruktorzy mam to „ruch” jednego i drugiego, który bierze odniesienie lwartości do obiektu:Jak zaimplementować konstruktor ruchu dla dziedziczenia w kształcie rombu?
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) // ???
};
Zresztą nie używamy hierarchii w kształcie rombu, jest to możliwe do wykonania konstruktora ruch dla betonu klasy ?
Dzięki!
Brzmi bardzo podatnie na błędy. Konstruktor wirtualnej bazy jest wywoływany z najbardziej pochodnej klasy i nie powinno być żadnego powodu, dla którego nie mógłby wywołać konstruktora ruchu. Ale jakiekolwiek dalsze wyprowadzenie i istnieje spora szansa, że ktoś o tym zapomni, lub zrobi to źle. Zasadą jest, że wirtualne klasy bazowe nie powinny zawierać danych lub przynajmniej konstruktorów innych niż domyślny konstruktor, aby uniknąć takich problemów. –
@JamesKanze Mam świadomość, że 'base' nie powinien zawierać danych lub przynajmniej mieć domyślny konstruktor, ale nie może tak być w moim kontekście. Czy jest jednak jakakolwiek szansa, że kompilator złoży skargę, jeśli ktoś zapomni zadzwonić do wirtualnego konstruktora bazowego, kiedy zacznie czerpać więcej? – piwi
@piwi, nie, nie ma szans, ponieważ 'base' nie ma domyślnego konstruktora, więc najbardziej wyprowadzony typ ** musi ** konstruować go jawnie –