关于c++的多继承(有关接口)

大家在学java C#的时候一定会看到类似这样的话“一些语言如C++支持所谓的‘多重继承’,即一个类派生于多个类。使用多重继承优点是有争议的:一方面,可以使用多重继承编写非常复杂、但很紧凑的代码;另一方面,使用多重实现继承的代码常常很难理解和调试。因此C#或者JAVA不支持多重实现继承。”然后可能大家就会对C++的多重继承保持一种不好的印象,可是大家不要忘了,在C#和java里面是有接口继承的,而且还是支持多重接口继承的。C++里面是“没有”明显接口定义的,我们在写程序的时候,也是很少使用C++的实现多重继承的,但是在一些稍大的程序里面,是常常会使用虚拟多重继承的,其实就是接口多重继承。所以说C++的多重承继机制的实现是为了完成C#和java所提的明显的接口机制而不是要我们程序员去滥用,而C#和java的设计者就用我们不太注意的这一点给我们打了一个马虎眼,让我们把C++的多重继承看成了一个不好的地方。
写一个小小的例子吧:
       #include <iostream>

       using namespace std;

       class CInterface1 // 接口1

       {

       public:
              virtual void func1() = 0;
       };

       class CInterface2 // 接口2

       {

       public:
              virtual void func2() = 0;
       };

       class CChild1: public CInterface1, public CInterface2 // 可以多重接口继承

       {

       public:
            void func1()
           {
                 cout << "第1.1种实现。" << endl;
           }
           void func2()
           {
                  cout << "第1.2种实现。" << endl;
           }
      };
      class CChild2: public CInterface1, public CInterface2
      { 
      public:
            void func1()
           {
                cout << "第2.1种实现。" << endl;
            }
            void func2()
            {
                  cout << "第2.2种实现。" << endl;
            }
      };

      int main(int argc, char* argv[])
      {
            CInterface1 *CI1;
            CInterface2 *CI2;
            CChild1 cc1;
            CI1 = &cc1;
            CI2 = &cc1;
            CI1->func1();
            CI2->func2();
            CChild2 cc2;
            CI1 = &cc2;
            CI2 = &cc2;
            CI1->func1();
            CI2->func2();
            return 0;
     }
我再加上一个例子吧,要做一套模拟鸭子游戏:SimUDuck。游戏中会出现各种鸭子。一边游泳戏水,一边呱呱叫。有些鸭子都会呱呱叫,也会游泳,而每一种鸭子外观都不一样。有些鸭子是可以飞的,而有些不行,叫也是,有的鸭子会叫有的就不会。那么我们怎么用C++来完成这个设计呀?

问题有:
1、鸭子有多种,如果我们把这些功能都写在父类里,那么会让所有鸭子都会飞会叫了。
2、如果只让父类有共同的方法,其他方法子类自己去添加;结果问题就出来了,可能这些子类不是一个人写的,他们可能把飞的方法写得不一样,参数可能也会有些不同,那么这对总体来说是一种伤害。

那么我们在设计的时候就可以用接口去设计了。

把每种鸭子都有的方法放在一个父类里面,把飞和叫设计成两个接口(在C++里就是只有方法的抽象类)。
子鸭子会叫或者会飞,就让他继承飞或者叫的接口。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值