Skip to content

Latest commit

 

History

History
9 lines (5 loc) · 1.07 KB

18. 用于大型程序的工具.md

File metadata and controls

9 lines (5 loc) · 1.07 KB

18. 用于大型程序的工具

18.1. 多重继承与虚继承

  • 虚继承是解决 C++ 多重继承问题的一种手段, 从不同途径继承来的同一基类, 会在子类中存在多份拷贝, 即浪费存储空间, 又存在二义性的问题.

  • 底层实现原理与编译器相关, 一般通过虚基类指针和虚基类表实现, 每个虚继承的子类都有一个虚基类指针 (占用一个指针的存储空间, 4 字节) 和虚基类表(不占用类对象的存储空间)(需要强调的是, 虚基类依旧会在子类里面存在拷贝, 只是仅仅最多存在一份而已, 并不是不在子类里面了); 当虚继承的子类被当做父类继承时, 虚基类指针也会被继承.

  • 实际上, vbptr 指的是虚基类表指针 (virtual base table pointer), 该指针指向了一个虚基类表(virtual table), 虚表中记录了虚基类与本类的偏移地址; 通过偏移地址, 这样就找到了虚基类成员, 而虚继承也不用像普通多继承那样维持着公共基类(虚基类) 的两份同样的拷贝, 节省了存储空间.