C++被遗弃的多重继承
C++中的多重继承
C++支持编写多重继承
- 一个子类可以拥有多个父类
- 子类拥有所有父类的成员变量
- 子类继承所有父类的成员函数
- 子类对象可以当作任意父类对象使用
//
class Derived : public BaseA,
public BaseB,
public BaseC
{
}
多重继承的问题
问题一
通过多继承得到的对象可能拥有“不同的地址”
问题二
多重继承可能产生冗余
处理方案:虚继承
class People{};
class Teacher : virtual public People{};
class Doctor : public Teacher{};
产生的问题
- 虚继承解决了数据冗余问题
- 中间层父类不再关心顶层父类的初始化
- 最终子类必须直接调用顶层父类的构造函数
小结
- C++支持多重继承的编程方式
- 多重继承的问题
- 可能出现“用一个对象的地址不同”
- 数据冗余
- 虚继承使得架构设计可能出现问题
问题三
多重继承可能产生多个虚函数表
正确使用多继承
单继承 + 实现多接口
#include <iostream>
using namespace std;
class Base
{
public:
int mi;
Base(int i)
{
mi = i;
}
int getI()
{
return mi;
}
};
class Interface1
{
public:
virtual void add(int i) = 0;
virtual void minus(int i) = 0;
};
class Interface2
{
public:
virtual void multiply(int i) = 0;
virtual void divide(int i) = 0;
};
class Derived : public Base,public Interface1,public Interface2
{
public:
Derived(int i):Base(i)
{
}
void add(int i)
{
mi += i;
}
void minus(int i)
{
mi -= i;
}
void multiply(int i)
{
mi *= i;
}
void divide(int i)
{
if (i!=0)
{
mi /= i;
}
}
};
int main(int argc, char const *argv[])
{
Derived d(100);
return 0;
}
正确使用多重继承
- 先继承一个父类,然后实现多个接口
- 父类中提供equal()成员函数
- equal()成员函数用于判断指针是否指向当前对象
- 与多重继承相关的强制类型转换用dynamic_cast完成
小结
- 多继承中可能出现多个虚函数表指针
- 与多重继承相关的强制类型转换用dynamic_cast完成
- 工程开发中,“单继承多接口”的方式使用多继承
- 父类提供了成员函数用于判断指针是否向电当前对象