在 C++ 中,多继承形式下的 **** 和单继承形式基本相同,只是要在派生类的构造函数中调用多个基类的构造函数。
基类构造函数的调用顺序和它们在派生类构造函数中出现的顺序无关,而是和声明派生类时基类出现的顺序相同。
D(paramlist): A(paramlist1), B(paramlist2), C(paramlist3){
//
}
我们在类 D 的构造函数中,依次调用了类 A、类 B 和类 C 的构造函数。
子类继承多个父类时,就称为多继承,子类可以调用多个父类的构造函数
#include <iostream>
using namespace std;
//工人类
class Worker
{
public:
Worker(float salary):m_salary(salary)
{
}
~Worker()
{
}
protected:
float m_salary;
};
//儿童类
class Children
{
public:
Children(float score):m_score(score)
{
}
~Children()
{
}
protected:
float m_score;
};
//童工类
class ChildrenWorker:public Worker, public Children
{
public:
ChildrenWorker(string name,float salary,float score):Worker(salary),Children(score),m_name(name)
{
}
void info()
{
cout << "Name = " << this->m_name << " Salary = " << this->m_salary << " Score = " << this->m_score << endl;
}
~ChildrenWorker()
{
}
private:
string m_name;
};
int main(void)
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
ChildrenWorker childWorker("HaiCoder", 1000, 100);
childWorker.info();
return 0;
}
程序运行后,控制台输出如下:
我们在子类 ChildrenWorker 的构造函数中,分别调用了 Worker 的构造函数和 Children 的构造函数,用来初始化了 ChildrenWorker 的成员变量。
基类构造函数的调用顺序和声明派生类时基类出现的顺序相同
#include <iostream>
using namespace std;
//工人类
class Worker
{
public:
Worker(float salary):m_salary(salary)
{
cout << "Call Worker" << endl;
}
~Worker()
{
}
protected:
float m_salary;
};
//儿童类
class Children
{
public:
Children(float score):m_score(score)
{
cout << "Call Children" << endl;
}
~Children()
{
}
protected:
float m_score;
};
//童工类
class ChildrenWorker:public Worker, public Children
{
public:
ChildrenWorker(string name,float salary,float score):Worker(salary),Children(score),m_name(name)
{
cout << "Call ChildrenWorker" << endl;
}
void info()
{
cout << "Name = " << this->m_name << " Salary = " << this->m_salary << " Score = " << this->m_score << endl;
}
~ChildrenWorker()
{
}
private:
string m_name;
};
int main(void)
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
ChildrenWorker childWorker("HaiCoder", 1000, 100);
childWorker.info();
return 0;
}
程序运行后,控制台输出如下:
我们看到,此时构造函数的调用顺序为 Worker、Children 和 ChildrenWorker,现在,我们修改程序,修改构造函数的初始化顺序,修改代码如下:
#include <iostream>
using namespace std;
//工人类
class Worker
{
public:
Worker(float salary):m_salary(salary)
{
cout << "Call Worker" << endl;
}
~Worker()
{
}
protected:
float m_salary;
};
//儿童类
class Children
{
public:
Children(float score):m_score(score)
{
cout << "Call Children" << endl;
}
~Children()
{
}
protected:
float m_score;
};
//童工类
class ChildrenWorker :public Worker, public Children
{
public:
ChildrenWorker(string name,float salary,float score):Children(score),Worker(salary),m_name(name)
{
cout << "Call ChildrenWorker" << endl;
}
void info()
{
cout << "Name = " << this->m_name << " Salary = " << this->m_salary << " Score = " << this->m_score << endl;
}
~ChildrenWorker()
{
}
private:
string m_name;
};
int main(void)
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
ChildrenWorker childWorker("HaiCoder", 1000, 100);
childWorker.info();
return 0;
}
程序运行后,控制台输出如下:
我们看到,此时我们修改了构造函数的初始化列表的顺序为 Children、Worker,但构造函数的顺序并没有改变,说明,构造函数的调用顺序与初始化列表顺序无关,现在,我们再次修改程序,修改继承顺序,修改代码如下:
#include <iostream>
using namespace std;
//工人类
class Worker
{
public:
Worker(float salary):m_salary(salary)
{
cout << "Call Worker" << endl;
}
~Worker()
{
}
protected:
float m_salary;
};
//儿童类
class Children
{
public:
Children(float score):m_score(score)
{
cout << "Call Children" << endl;
}
~Children()
{
}
protected:
float m_score;
};
//童工类
class ChildrenWorker : public Children,public Worker
{
public:
ChildrenWorker(string name,float salary,float score):Worker(salary),Children(score),m_name(name)
{
cout << "Call ChildrenWorker" << endl;
}
void info()
{
cout << "Name = " << this->m_name << " Salary = " << this->m_salary << " Score = " << this->m_score << endl;
}
~ChildrenWorker()
{
}
private:
string m_name;
};
int main(void)
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
ChildrenWorker childWorker("HaiCoder", 1000, 100);
childWorker.info();
return 0;
}
程序运行后,控制台输出如下:
这次,我们修改了继承顺序,这次,调用构造函数的顺序变了,因此可以说明,调用构造函数的顺序和继承的顺序保持一致的。
在 C++ 的多继承中,基类构造函数的调用顺序和它们在派生类构造函数中出现的顺序无关,而是和声明派生类时基类出现的顺序相同。