Ваша проблема в том, что, поскольку все конструкторы инициализируют все свои элементы перед вводом тела конструктора,
Derived(const Derived &other)
{
// Implict call to Base(), which is deleted, and compilation fails.
std::cout << "Derived's copy constructor" << std::endl;
this->_x = other._x;
this->_y = other._y;
}
фактически
Derived(const Derived &other) : Base(), _y()
{
// Implict call to Base(), which is deleted, and compilation fails.
std::cout << "Derived's copy constructor" << std::endl;
this->_x = other._x;
this->_y = other._y;
}
Где Base()
вызывает базуКонструктор класса по умолчанию.
Вам нужно использовать список инициализаторов членов для вызова конструктора копирования базового класса вместо конструктора по умолчанию.Для этого вы используете
Derived(const Derived &other) : Base(other), _y(other._y)
{
// Implict call to Base(), which is deleted, and compilation fails.
std::cout << "Derived's copy constructor" << std::endl;
// this->_x = other._x; no longer needed as Base(other) takes care of _x
// this->_y = other._y; no longer needed as _y(other._y) takes care of _y
}
Вы также должны обновить конструктор копирования Base
до
Base(const Base &other) : _x(other._x)
{
std::cout << "Base's copy constructor" << std::endl;
}
Также обратите внимание, что вы можете получитьбез определения любого из этих конструкторов копирования.Поскольку вы не определили деструктор, компилятор автоматически сгенерирует конструкторы копирования для обоих классов, и эти конструкторы копирования по умолчанию будут работать.