Почему неявный конструктор копирования вызывает конструктор копирования базового класса, а определенный конструктор копирования - нет?

Рассмотрим иерархию классов, гдеA это базовый класс иB происходит отA.

Если конструктор копирования не определен вB, компилятор будет синтезировать один. Когда вызвано, этот конструктор копии вызоветконструктор копирования базового класса (даже синтезированный, если никто не был предоставлен пользователем).

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

Выход:

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

Если пользователь определяет свой собственный конструктор копирования вBпри вызове этот конструктор копирования будет вызыватьконструктор по умолчанию для базового классаесли только вызов конструктора копирования базового класса явно не присутствует (например, в списке инициализации).

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

Выход:

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

Мой вопрос: почему пользовательский конструктор копирования не вызывает конструктор копирования базового класса как поведение по умолчанию?

Ответы на вопрос(3)

Ваш ответ на вопрос