C++ 多重继承的优缺点

举例:现实生活中,许多事物可能有两个或者两个以上事物的属性,为了描述这种情况,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就可以了。
     

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

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

总结:

优点:

多继承,可以调用多个基类的不同方法

缺点:

多继承的类,如果调用基类的基类中的方法,容易造成歧义

部分参考:

多继承的概念和优缺点_多继承的优点与缺点-CSDN博客

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值