次のおもちゃクラス A とその子 B があります。
#include <iostream>
using namespace std;
class A
{
protected:
int a;
public:
A():a(1){cout<<"A default constructor..."<<endl;}
A(int i):a(i){cout<<"A non-default constructor..."<<endl;}
A(const A &ao){cout<<"A copy constructor..."<<endl; a=ao.a;}
};
class B:public A
{
private:
int b;
public:
B(int i,int j):A(i),b(j){cout<<"B constructor..."<<endl;}
//B(const B &bo){cout<<"B copy constructor... "<<endl; b=bo.b;}
void print(){cout<<endl<<"class B, a: "<<a<<" b: "<<b<<endl<<endl;}
};
int main()
{
B b1(3,8);
b1.print();
B b2=b1;
b2.print();
}
クラス B にコピー コンストラクターを提供しないと、コンパイラーが合成してくれ、クラス A に提供したコピー コンストラクターを使用することがわかりました。ただし、クラス B にコピー コンストラクターを提供すると、基本クラス A のコピー コンストラクターを明示的に呼び出さない場合 (コードを参照)、コンパイラーはクラス A の既定のコンストラクターを呼び出しますか? 何故ですか?