Это может быть вопрос с очевидным ответом или дублированием. Если да, извините, я его удалю.
Почему конструкторы копирования не привязаны (например, по умолчанию 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
, чтобы изменить его.
Есть ли что-то фундаментальное, что мне не хватает в конструкторах копий, так что моя ментальная модель неверна или есть какая-то тайная (или не тайная) причина для этого дизайна?