举例:现实生活中,许多事物可能有两个或者两个以上事物的属性,为了描述这种情况,C++引入了多继承。
允许一个类指向多个基类,这样继承的结构叫多重继承。
概念
多重继承:常规情况,一个类只有一个基类,而C++支持多重继承,即一个类可以继承自多个类。
人(Person)可以吃饭和睡觉,既可以是作家也可以是程序员,作家可以写文章,程序员可以写程序,
即是作家又是程序员的人能够写文章和写程序。
使用多重继承的例子程序如下:
#include <iostream>
using namespace std;
class Person
{
public:
void sleep() {cout << "sleep" << endl;}
void eat() {cout << "eat" << endl;}
};
class Author : public Person //Author继承自Person
{
public:
void writeBook() {cout << "write Book" << endl;}
};
class Programmer : public Person //Programmer继承自Person
{
public:
void writeCode() {cout << "write Code" << endl;}
};
class Programmer_Author : public Programmer, public Author //多重继承
{
};
int main()
{
Programmer_Author pa;
pa.writeBook(); //调用基类Author的方法
pa.writeCode(); //调用基类Programmer的方法
pa.eat(); //编译错误,eat()定义不明确
pa.sleep(); //编译错误,sleep()定义不明确
return 0;
}
多重继承的优点很明显,就是对象可以调用多个基类中的接口,如代码31行与代码32行对象pa分别调用Author类的writeBook()函数和Programmer类的writeCode()函数。
多重继承的缺点是什么呢?如果派生类所继承的多个基类有相同的基类,而派生类对象需要调用这个祖先类的接口方法,就会容易出现二义性。代码33、34行就是因为这个原因而出现编译错误的。因为通过多重继承的Programmer_Author类拥有Author类和Programmer类的一份拷贝,而Author类和Programmer类都分别拥有Person类的一份拷贝,所以Programmer_Author类拥有Person类的两份拷贝,在调用Person类的接口时,编译器会不清楚需要调用哪一份拷贝,从而产生错误。对于这个问题通常有两个解决方案:
(1)加上全局符确定调用哪一份拷贝。比如pa.Author::eat()调用属于Author的拷贝。
(2)使用虚拟继承,使得多重继承类Programmer_Author只拥有Person类的一份拷贝。比如在11行和17行的继承语句中加入virtual就可以了。
-
class Author : virtual public Person //Author虚拟继承自Person
-
class Programmer : virtual public Person //Programmer虚拟继承自Person
总结:
优点:
多继承,可以调用多个基类的不同方法
缺点:
多继承的类,如果调用基类的基类中的方法,容易造成歧义
部分参考: