C++对象模型中数据成员与继承

继承与数据成员的关系

这里我们讨论继承与数据成员的关系主要涉及这几个方面:

1.单一继承同时又不含virtual fucntions

2.单一继承并含虚函数

3.多重继承

4.虚拟继承

单一继承同时又不含virtual function的情况:

1.这里注意主要这一张单一继承的关系无法表现出多态,也就是多不能通过基类的对象来同时处理基类以及派生类的对象。

2.这里可能会造成代码膨胀的问题,注意单一继承不带虚函数的派生类的内存布局。

单一继承并带虚函数的情况(effective c++说了尽量寻找虚函数的替代方案,关键是我们多态的使用是否频繁)

这种情况,虚函数讲给派生类带来的负担包括:

1.需要导入一个虚表 用来存放它所声明的每一个虚函数的地址。

2.每一个class都导入一个虚指针,让每一个objects都能找到虚表。

3.加强构造函数,为class设定vptr。

4.将强析构函数,抹消指向虚表的虚指针。

至于这些带来的负担是否值得,需要根据我们实际处理的派生类或基类对象的个数以及生命期决定,当然如果每个对象的生命期很短,并且对象很多,显然虚函数的做法会带来很多负担。

在对象模型中把vptr放在内存模型的开始还是结束这也是个注意的问题,现在一般编译器将其放在对象内存的开头。

多重继承下的内存模型

这时候实行对台指针转换操作会带来额外的内存偏移开销。

虚拟继承下的对象模型

在虚拟继承下又会引入指向虚拟基类的部分的指针,这将带来进一步的复杂度,可能实现上又会出现一个虚表。

所以虚基类的最好做法是没有任何数据成员。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值