多继承概念
- 一个类有多个直接基类的继承关系称为多继承。
- 多继承声明语法。
形如:
class 派生类名 : 访问控制 基类名1, 访问控制 基类名2, ...
{
数据成员和成员函数声明
};
qt中QWidget有使用多继承,源码如下:
class Q_WIDGETS_EXPORT QWidget : public QObject, public QPaintDevice
{
......
};
优点:
- 多继承的派生类继承了所有父类的成员,可以调用多个基类的不同方法。
缺点:
- 多个基类的相互交织可能会带来错综复杂的设计问题,命名冲突就是不可回避的一个。多继承时很容易产生命名冲突,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生,比如典型的是菱形继承。
- 继承的多个类里面不能存在相同名字的成员变量或函数,派生类中调用相同名字的变量或函数会出现歧义。
如下所示:
存在问题:
- 从不同途径继承来的同一基类,会在子类中存在多份拷贝。这将存在两个问题:第一,浪费存储空间;第二,存在二义性问题。
解决方法:
- 虚继承=》C++ 提供虚基类(virtual base class)的方法,使得在继承间接共同基类时只保留一份成员。方法如下:
class A // 声明基类A
{
// 代码
};
class B: virtual public A // 声明类 B 是类 A 的公有派生类,A 是 B 的虚基类
{
// 代码
};
class C: virtual public A // 声明类 C 是类 A 的公有派生类,A 是 C 的虚基类
{
// 代码
};
class D: public B, public C // 类 D 中只有一份 A 的数据
{
// 代码
};