Considere una jerarquía de clases donde A
es la clase base y B
deriva de A
.¿Por qué el constructor de copia implícita llama al constructor de copia de la clase base y el constructor de copia definido no?
Si el constructor de copia no está definido en B
, el compilador sintetizará uno. Cuando se invoca, este constructor de copia llamará al el constructor de copia de la clase base (incluso el sintetizado, si el usuario no lo ha proporcionado).
#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 copia en B
, cuando se invoca, este constructor de copia llamará el constructor base por defecto de clase, a menos que una llamada a el constructor de copia de la clase base está explícitamente presente (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é no el definido por el usuario constructor de copia llamar al constructor de copia clase base como un comportamiento por defecto?
Si fuera así por defecto, ¿cómo especificaría el caso en el que no desea que eso suceda? – PlasmaHH
@PlasmaHH 'ParentClass()' en la lista de inicializadores. Eso todavía sería bastante inconsistente y confuso, creo. –
@MarkB: De hecho, esperaba que llegara a la misma conclusión al pensar en ello ... – PlasmaHH