C++-多重继承
要点
- 当一个类有多个父类时,每个父类在内存中依次排列,然后该类自己的成员。
- 每一个父类的镜像中,都包含有独立的虚函数表
- 当把子类的指针Upcast的时候,两种Upcast的方式得到的结果分别指向各自的父类镜像
- 当两个父类重载的虚函数不同时,会使用Thunk机制,也就是说,虚函数表中的函数指针并不指向实际的虚函数,而是指向一小段代码。在这一小段代码中,会修改This指针(ECX寄存器),使之指向合适的父类镜像,然后再跳转到实际的虚函数体。
- 当不使用虚继承时,共同基类的成员对象,在子类中会有独立两分(从两个父类各自继承了一份)。
- 当使用虚继承时,共同基类的成员对象也会在虚函数表中记录,访问它必须先查找虚函数表。
为什么不建议使用多重继承?
- 可能会引入菱形继承,而为了解决这种问题,有需要引入虚拟继承,而虚拟继承实现复杂,占用更多的内存,且效率低