Рассмотрим иерархию классов, где 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
Мой вопрос в том, почему пользовательский конструктор копирования не вызывает конструктор копии базового класса как поведение по умолчанию?