继承与数据成员的关系
这里我们讨论继承与数据成员的关系主要涉及这几个方面:
1.单一继承同时又不含virtual fucntions
2.单一继承并含虚函数
3.多重继承
4.虚拟继承
单一继承同时又不含virtual function的情况:
1.这里注意主要这一张单一继承的关系无法表现出多态,也就是多不能通过基类的对象来同时处理基类以及派生类的对象。
2.这里可能会造成代码膨胀的问题,注意单一继承不带虚函数的派生类的内存布局。
单一继承并带虚函数的情况(effective c++说了尽量寻找虚函数的替代方案,关键是我们多态的使用是否频繁)
这种情况,虚函数讲给派生类带来的负担包括:
1.需要导入一个虚表 用来存放它所声明的每一个虚函数的地址。
2.每一个class都导入一个虚指针,让每一个objects都能找到虚表。
3.加强构造函数,为class设定vptr。
4.将强析构函数,抹消指向虚表的虚指针。
至于这些带来的负担是否值得,需要根据我们实际处理的派生类或基类对象的个数以及生命期决定,当然如果每个对象的生命期很短,并且对象很多,显然虚函数的做法会带来很多负担。
在对象模型中把vptr放在内存模型的开始还是结束这也是个注意的问题,现在一般编译器将其放在对象内存的开头。
多重继承下的内存模型
这时候实行对台指针转换操作会带来额外的内存偏移开销。
虚拟继承下的对象模型
在虚拟继承下又会引入指向虚拟基类的部分的指针,这将带来进一步的复杂度,可能实现上又会出现一个虚表。
所以虚基类的最好做法是没有任何数据成员。