C++在语法上直接支持多重继承
class P1 { protected: int i; }; class P2 { protected: int j; }; class Child: public P1,public P2 { public: Child() { i = 1; j = 2; } void print() { cout<<"i = "<<i<<" "<<"j = "<<j<<endl; } };
被实际开发经验抛弃的多继承
工程开发中真正意义上的多继承是几乎不被使用的
多重继承带来的代码复杂性远多于其带来的便利
多重继承对代码维护性上的影响是灾难性的
在设计方法上,任何多继承都可以用单继承代替
C++中对多继承二义性的解决方案
虚继承::
为了解决从不同途径继承来的同名数据成员造成的二义性问题,可以
将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成
员在内存中就只有一个拷贝。
class P1: virtual public Object { protected: int i; }; class P2:virtual public Object { protected: int j; };
关于接口:
绝大多数面向对象语言都不支持多继承
绝大多数面向对象语言都支持接口的概念
C++中没有接口的概念
C++中可以使用纯虚函数实现接口
class Interface { public: virtual void fun1() = 0; virtual void fun2(int i) = 0; virtual void fun3(int i, int j,) = 0; };
接口类中只有函数原型定义,没有任何数据的定义。
实际工程经验证明
多重继承接口不会带来二义性和复杂性等问题
多重继承可以通过精心设计用单继承和接口来代替
接口类只是一个功能说明,而不是功能实现。
子类需要根据功能说明定义功能实现。