c++多重继承及优缺点

Posted 卷起来卷起来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++多重继承及优缺点相关的知识,希望对你有一定的参考价值。

实际生活中,一些事物往往会拥有两个或两个以上事物的属性,为了解决这个问题,C++引入了多重继承的概念,C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承。
举个例子:
人(Person)可以派生出作者(Author)和程序员(Programmer),然而程序员作者同时拥有作家和程序员的两个属性,即既能编程又能写作,如图9.2所示。

使用多重继承的例子程序如下:

#include <iostream>
2       using namespace std;
3      
4       class Person
5       
6       public:
7                void sleep() cout << "sleep" << endl;
8                void eat() cout << "eat" << endl;
9       ;
10    
11     class Author : public Person             //Author继承自Person
12     
13     public:
14              void writeBook() cout << "write Book" << endl;
15     ;
16    
17     class Programmer : public Person       //Programmer继承自Person
18     
19     public:
20              void writeCode() cout << "write Code" << endl;
21     ;
22    
23     class Programmer_Author : public Programmer, public Author     //多重继承
24     
25     ;
26    
27     int main()
28     
29              Programmer_Author pa;
30    
31              pa.writeBook();   //调用基类Author的方法
32              pa.writeCode();   //调用基类Programmer的方法
33              pa.eat();         //编译错误,eat()定义不明确
34              pa.sleep();       //编译错误,sleep()定义不明确
35    
36              return 0;
37     

多重继承的优点很明显,就是对象可以调用多个基类中的接口,如代码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就可以了。

  1. class Author : virtual public Person //Author虚拟继承自Person
  2. class Programmer : virtual public Person //Programmer虚拟继承自Person

实际生活中,一些事物往往会拥有两个或两个以上事物的属性,为了解决这个问题,C++引入了多重继承的概念。
多重继承的优点是对象可以调用多个基类中的接口。
多重继承的缺点是容易出现继承向上的二义性。

以上是关于c++多重继承及优缺点的主要内容,如果未能解决你的问题,请参考以下文章

C++ 多重继承

继承受保护函数和公共变量 C++ 的多重继承编译错误

C++的探索路12继承与派生之高级篇--派生类与赋值运算符及多重继承

C++的多重继承

Java面向对象基础

C++ 多重继承的真实例子是啥? [关闭]