Это может быть вопрос с очевидным ответом или дубликатом.Если так, извините, я его удалю.
Почему конструкторы копирования не связаны (например, ctors или dtors по умолчанию), чтобы перед вызовом конструктора копирования производного класса вызывался конструктор копирования базового класса?С помощью конструкторов копирования и деструкторов они вызываются в цепочке от основания к производному и от производства к базе, соответственно.Почему это не так для конструкторов копирования?Например, этот код:
class Base {
public:
Base() : basedata(rand()) { }
Base(const Base& src) : basedata(src.basedata) {
cout << "Base::Base(const Base&)" << endl;
}
void printdata() {
cout << basedata << endl;
}
private:
int basedata;
};
class Derived : public Base {
public:
Derived() { }
Derived(const Derived& d) {
cout << "Derived::Derived(const Derived&)" << endl;
}
};
srand(time(0));
Derived d1; // basedata is initialised to rand() thanks to Base::Base()
d1.printdata(); // prints the random number
Derived d2 = d1; // basedata is initialised to rand() again from Base::Base()
// Derived::Derived(const Derived&) is called but not
// Base::Base(const Base&)
d2.printdata(); // prints a different random number
Конструктор копирования на самом деле не делает (не может) копировать объект, потому что Derived::Derived(const Derived&)
не может получить доступ к basedata
для его изменения.
Есть что-то фундаментальное, что я упускаю в конструкторах копирования, так что моя ментальная модель неверна, или есть какая-то непонятная (или не загадочная) причина этого дизайна?