这里总结下C++中关于子类继承父类后构造方法的调用问题
1.首先看下这种情况
//父类
class parent
{
public:
parent(int b){cout<<"parent has parame b = "<<b<<endl;}
};
//子类
class child : public parent
{
public:
child(int a){cout<<"child has parame a = "<<a<<endl;}
};
//main函数
#include "child.h"
int main()
{
child a(5);
}
父类和子类各有一个带整形形参的构造方法,此时编译程序,是有错误的,如下
F:\qt_program\cpp_test\child.h:-1: In constructor 'child::child(int)':
F:\qt_program\cpp_test\child.h:9: error: no matching function for call to 'parent::parent()'
child(int a){cout<<"child has parame a = "<<a<<endl;}
什么意思呢?就是说在构造child类时候,调用了父类构造方法parent,但是这个构造方法必须不带参数,
而父类中是没有这么一个方法的,所以会产生这个错误。
2.我们把父类改为如下形式,加入一个不带形参的构造方法
class parent
{
public:
parent(){cout<<"parent no parame"<<endl;}
parent(int b){cout<<"parent has parame b = "<<b<<endl;}
};
那么此时就编译通过了,输出信息为:
parent no parame
parent has parame b = 5
也就说在子类实例化过程中,首先默认调用了父类无参构造函数,然后再调用子类构造函数
3.那么如果我们子类想调用父类的带参构造函数怎么办呢?就需要对子类作如下修改:
class child : public parent
{
public:
child(int a):parent(6)
{cout<<"child has parame a = "<<a<<endl;}
};
这样子类在构造时候,会默认先调用父类带参构造,然后在调用子类相应构造方法