例1:
#include<iostream>
using namespace std;
class B {
public:
B() { cout << "无参构造函数" << endl; }
B(int bb):b(bb) { cout << "有参构造函数" << endl; }
private:
int b;
};
class D :public B {
public:
D(int bb,int dd):d(dd){}
private:
int d;
};
int main() {
D d(1, 2);
system("pause");
return 0;
}
这里派生类构造函数调用的应该是B()
。
例2:
#include<iostream>
using namespace std;
class B {
public:
B() { cout << "无参构造函数" << endl; }
B(int bb=0):b(bb) { cout << "有参构造函数" << endl; }
private:
int b;
};
class D :public B {
public:
D(int bb,int dd):d(dd){}
private:
int d;
};
int main() {
D d(1, 2);
system("pause");
return 0;
}
此时会报错,因为有多个默认构造函数,编译器不知道该调用哪个。
例3:
#include<iostream>
using namespace std;
class B {
public:
B(int bb):b(bb) { cout << "有参构造函数" << endl; }
private:
int b;
};
class D :public B {
public:
D(int bb,int dd):d(dd){}
private:
int d;
};
int main() {
D d(1, 2);
system("pause");
return 0;
}
此时会报错,因为基类有自定义的构造函数,不存在默认构造函数,所以在派生类构造函数的初始化列表中不能省略对基类构造函数的调用。即修改程序如下:D(int bb,int dd):d(dd),B(bb){}
总结一下:如果基类中有无参的构造函数或者没有定义构造函数,则在派生类构造函数的初始化列表中可以省略对基类构造函数的调用。