¿Por qué el constructor de copia implícita llama al constructor de copia de clase base y el constructor de copia definido no?
Considere una jerarquía de clases dondeA
es la clase base yB
deriva deA
.
Si el constructor de copia no está definido enB
, el compilador sintetizará uno. Cuando se invoca, este constructor de copia llamará ael constructor de copia de clase base (incluso el sintetizado, si el usuario no ha proporcionado ninguno).
#include <iostream>
class A {
int a;
public:
A() {
std::cout << "A::Default constructor" << std::endl;
}
A(const A& rhs) {
std::cout << "A::Copy constructor" << std::endl;
}
};
class B : public A {
int b;
public:
B() {
std::cout << "B::Default constructor" << std::endl;
}
};
int main(int argc, const char *argv[])
{
std::cout << "Creating B" << std::endl;
B b1;
std::cout << "Creating B by copy" << std::endl;
B b2(b1);
return 0;
}
Salida
Creating B
A::Default constructor
B::Default constructor
Creating B by copy
A::Copy constructor
Si el usuario define su propio constructor de copias enB
, cuando se invoca, este constructor de copia llamará ael constructor predeterminado de la clase base, a menos que una llamada al constructor de copia de la clase base esté presente explícitamente (por ejemplo, en la lista de inicialización).
#include <iostream>
class A {
int a;
public:
A() {
std::cout << "A::Default constructor" << std::endl;
}
A(const A& rhs) {
std::cout << "A::Copy constructor" << std::endl;
}
};
class B : public A {
int b;
public:
B() {
std::cout << "B::Default constructor" << std::endl;
}
B(const B& rhs) {
std::cout << "B::Copy constructor" << std::endl;
}
};
int main(int argc, const char *argv[])
{
std::cout << "Creating B" << std::endl;
B b1;
std::cout << "Creating B by copy" << std::endl;
B b2(b1);
return 0;
}
Salida
Creating B
A::Default constructor
B::Default constructor
Creating B by copy
A::Default constructor
B::Copy constructor
Mi pregunta es, ¿por qué el constructor de copias definido por el usuario no llama al constructor de copias de la clase base como un comportamiento predeterminado?