Por que o construtor de cópia implícito chama o construtor de cópia da classe base e o construtor de cópia definido nã

Considere uma hierarquia de classes em queA é a classe base eB deriva deA.

Se o construtor de cópia não estiver definido emB, o compilador sintetizará um. Quando invocado, esse construtor de cópia chamaráo construtor de cópia da classe base (mesmo o sintetizado, se nenhum tiver sido fornecido pelo usuário

#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;
}

Resultado

Creating B
A::Default constructor
B::Default constructor
Creating B by copy
A::Copy constructor

Se o usuário definir seu próprio construtor de cópias emB, quando invocado, este construtor de cópias chamaráo construtor padrão da classe base, a menos que haja uma chamada explícita para o construtor de cópias da classe base (por exemplo, na lista de inicialização

#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;
}

Resultado

Creating B
A::Default constructor
B::Default constructor
Creating B by copy
A::Default constructor
B::Copy constructor

inha pergunta é: por que o construtor de cópias definido pelo usuário não chama o construtor de cópias da classe base como um comportamento padrã

questionAnswers(6)

yourAnswerToTheQuestion