多继承给 C++ 带来了哪些设计负担?
- 指针偏移本身有少量开销,若需要偏移则得先判空,这样才能保证空指针永远为空。
- 指针偏移对设计虚函数表带来了困难。例如 thunk 技术用来对 this 指针做适配再调用对应函数。
- 指针偏移让指向成员函数的指针携带了 this 偏移量,变成了胖指针。
- 多继承引入了菱形继承困境,进而又引入了虚拟继承。
- 虚拟继承使得 vtable 中还要存储虚基类子对象的偏移。由于不同继承结构中 vtable 里虚基类子对象的偏移可能不同,又引入了 VTT,让子类调用基类构造函数时为基类的构造函数提供 vptr 参数。