概述多重继承 (multiple inheritance): 一个派生类有两个或多个基类, 派生类从两个或多个基类中继承所需的属性. C 为了适应这种情况, 允许一个派生类同时继承多个基类. 这种行为称为多重继承.优缺点优点自然地做到了对单继承的扩展可以继承多个类的功能缺点结构复杂化优先顺序模糊功能冲突声明多重继承的方法格式多重继承的格式:1234567派生类构造函数名(总形式参数表列):基类1构造函数(实际参数表列),基类2构造函数(实际参数表列),基类3构造函数(实际参数表列){派生类中新增数成员据成员初始化语句}例子Teacher 类:1234567891011121314151617#ifndef PROJECT5_TEACHER_H#define PROJECT5_TEACHER_H#include stringusingnamespacestd;classTeacher {protected:string name;intage;string title;public:Teacher(string n,inta, string t);voiddisplay_teacher();};#endif //PROJECT5_TEACHER_HTeacher.cpp:1234567891011#include iostream#include Teacher.husingnamespacestd;Teacher::Teacher(string n,inta, string t) : name(n), age(a), title(t) {}voidTeacher::display_teacher() {cout Teacher name: name endl;cout age: age endl;cout title: title endl;}Student 类:1234567891011121314151617#ifndef PROJECT5_STUDENT_H#define PROJECT5_STUDENT_H#include stringusingnamespacestd;classStudent {protected:string name;chargender;doublescore;public:Student(string n,charg,doubles);voiddisplay_student();};#endif //PROJECT5_STUDENT_HStudent.cpp:1234567891011#include iostream#include Student.husingnamespacestd;Student::Student(string n,charg,doubles) : name(n), gender(g), score(s) {}voidStudent::display_student() {cout Student name: name endl;cout gender: gender endl;cout score: score endl;}Graduate 类1234567891011121314151617#ifndef PROJECT5_GRADUATE_H#define PROJECT5_GRADUATE_H#include Teacher.h#include Student.h#include stringusingnamespacestd;classGraduate :publicTeacher,publicStudent{private:doublewage;public:Graduate(string t_n,intt_a, string t_t, string s_n,chars_g,doubles_s);voiddisplay_graduate();};#endif //PROJECT5_GRADUATE_HGraduate.cpp:12345678910#include Graduate.hGraduate::Graduate(string t_n,intt_a, string t_t, string s_n,chars_g,doubles_s) :Teacher(t_n, t_a, t_t),Student(s_n, s_g, s_s) {}voidGraduate::display_graduate() {display_teacher();display_student();}main:12345678910#include iostream#include Graduate.husingnamespacestd;intmain() {Graduate graduate1(王叔叔, 18,隔壁老王,我是小白呀,f, 99);graduate1.display_graduate();return0;}输出结果123456Teacher name: 王叔叔age: 18title: 隔壁老王Student name: 我是小白呀gender: fscore: 99二义性二义性 (Ambiguity) 指在多重继承中, 两个基类中的数据成员名相同.二义性在派生类中的解决方法:在标识符前用类名做前缀: Teacher::name 和 Student::name基类和派生类需要有一个完整的设计, 不能随意而为两个基类有同名成员A 类:12345678910111213#ifndef PROJECT5_A_H#define PROJECT5_A_H#include iostreamusingnamespacestd;classA {public:intnum;voiddisplay() {cout As num: num endl;};};#endif //PROJECT5_A_HB 类:12345678910111213#ifndef PROJECT5_B_H#define PROJECT5_B_H#include iostreamusingnamespacestd;classB {public:intnum;voiddisplay() {cout Bs num: num endl;};};#endif //PROJECT5_B_HC 类:123456789101112131415#ifndef PROJECT5_C_H#define PROJECT5_C_H#include iostream#include A.h#include B.husingnamespacestd;classC:publicA,publicB{public:intc;voiddisplay() {cout c endl;};};#endif //PROJECT5_C_Hmain:12345678910111213#include iostream#include C.husingnamespacestd;intmain() {C c1;c1.A::num 1;// 用基类名限定c1.B::num 2;// 用基类名限定c1.A::display();c1.B::display();return0;}输出结果:12As num:1Bs num:2错误的写法1234567891011#include iostream#include C.husingnamespacestd;intmain() {C c1;c1.num 1;c1.display();return0;}基类和派生类有同名成员A 类:12345classA {public:intnum;voiddisplay() {cout As num: num endl;};};B 类:12345classB {public:intnum;voiddisplay() {cout Bs num: num endl;};};C 类:12345classC:publicA,publicB{public:intnum;voiddisplay() {cout Cs num: num endl;};};main:1234567891011intmain() {C c1;c1.num 3;c1.A::num 1;c1.B::num 2;c1.display();c1.A::display();c1.B::display();return0;}输出结果:123Cs num:3As num:1Bs num:2同名覆盖:基类的同名成员在派生类中被屏蔽, 成为 不可见的对成员函数, 限于函数名和参数个数相同, 类型相匹配. 若只有函数名相同而参数不同, 属于函数重载