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

Рассмотрим иерархию классов, где 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

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

35
задан John_West 20 October 2013 в 12:08
поделиться