1、如果基类定义了不带参数的默认构造函数,则编译器为派生类自动生成的默认构造函数会调用基类的默认构造函数。
2、如果基类定义了拷贝构造函数,则编译器为派生类自动生成的拷贝构造函数同样会调用基类的拷贝构造函数。
3、如果基类定义了带参数的构造函数,派生类没有定义任何带参数的构造函数,则不能直接调用基类的带参构造函数,程序编译不通过。
代码如下:
#include<iostream>
using namespace std;
//基类Game,定义了两个构造函数和一个拷贝构造函数
class Game
{
public:
Game()
{
cout<<"构造函数:Game()\n";
}
Game(const Game& game)
{
cout<<"拷贝构造函数:Game(const Game& game)\n";
}
Game(int i)
{
cout<<"Game(int i)\n";
}
};
//派生类Chess,没有定义任何构造函数和拷贝构造函数
class Chess : public Game
{
};
int main()
{
Chess ch1;
Chess ch2(ch1);
//Chess ch3(1);
cout<<"结束!";
int i;
cin>>i;
return 0;
}
运行结果如下:
如果不注释掉“Chess ch3(1)”这一行,即直接调用带参数的构造函数会报错:没有与参数列表匹配的构造函数 "Chess::Chess" 实例,所以验证了第3条结论。