单继承是一个类从另一个基类派生类而来的,多继承则是一个派生类是同两个或多个基类,派生类从两人或多个基类中继承所需的属性。
声明多重继承的方法:
class D: public A, private B, protected C
{
类D新增加的成员
}
一、多重继承派生类的构造函数
多重继承派生类的构造函数形式与单继承时的构造函数形式基本相同,只是在初始表中包含多个基类构造函数。如:
派生类构造函数名 ( 总参数表列 ) : 基类1构造函数 ( 参数表列 ) ,基类2构造函数 (参数表列) ,基类3构造函数 (参数表列)
{
派生类中新增数据成员初始化语句
}
派生类构造函数的执行顺序:同样还是先调用基类的构造函数,再执行派生类构造函数的函数体。
示例代码:
#include <iostream>
#include <string>
using namespace std;
class Teacher{
protected:
string name;
int age;
string post; //职称
public:
// 构造函数
Teacher(string name, int age, string post): name(name), age(age), post(post){}
};
class Student{
protected:
string name;
int age;
int score;
public:
// 构造函数
Student(string name, int age, int score): name(name), age(age), score(score){}
};
class Graduate: public Teacher, public Student{
private:
int wage; //工资
public:
// 多继承构造函数
Graduate(string name, int age, string post, int score, int wage):
Teacher(name, age, post), Student(name, age, score), wage(wage){}
// 显示信息
void display(){
cout <<"name:" <<Teacher::name <<endl;
cout <<"age:" <<Teacher::age <<endl;
cout <<"post:" <<post <<endl;
cout <<"score:" <<score <<endl;
cout <<"wage:" <<wage <<endl;
}
};
int main(){
// 实例对象
Graduate graduate("Tom", 20, "history", 90.5, 5000);
// 显示结果
graduate.display();
return 0;
}
运行结果如下:
注意的是,Teacher类和Student类中都有name和age数据成员,这样程序就不知道调用哪一个,没作指明则系统编译时会报错【[Error] reference to 'name' is ambiguous】- 对'name'的引入有歧义。但如何指明其作用域呢,上述代码中已经体现了,通过类名来指定作用域,如:
cout <<"name:" <<Teacher::name <<endl;
二、多重继承引起的二义性问题
多重继承可以反映现实生活中的情况,能够用效地处理一些较复杂的问题,使编写程序具有灵活性,但是多重继承也引起了一些值得注意的问题,它增加了程序的复杂性,最常见的问题则是继承的成员同名而产生的二义性(ambiguous)问题。
(1)两个基类有同名成员。如下图:
示例代码如下:
#include <iostream>
#include <string>
using namespace std;
class Teacher{
protected:
string name;
int age;
string post; //职称
public:
// 构造函数
Teacher(string name, int age, string post): name(name), age(age), po