大家在学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++里就是只有方法的抽象类)。
子鸭子会叫或者会飞,就让他继承飞或者叫的接口。
写一个小小的例子吧:
#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++里就是只有方法的抽象类)。
子鸭子会叫或者会飞,就让他继承飞或者叫的接口。