¿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?

Respuestas a la pregunta(6)

Su respuesta a la pregunta