C++对象继承后的内存分布

1. 如果父类的纯虚函数没有实现,在没有使用的的情况下(没有new 或者直接生成对象)编译不会报未定义。

最近将一个类对象指针直接转换为void*存储到了vector中,使用时再用static_cast转换为对应的父类指针,发现在多继承的情况下这样会有问题。原因是此对象有多个父类,static_cast是直接将父类指针指向了对象的内存地址,这样在调用父类方法的时候就出现了问题,找不到这个父类的虚函数。因为在多继承的情况下,第一个父类的vfptr才是跟对象的首地址相同,其他父类的依次+4个字节。  所以想到了用dynamic_cast,但是编译器报错void*没有动态转换信息。所以在这种情况下,必须将void*转换为有类型信息的指针才可以,而且void* 指向的内存地址一定要是对应父类vfptr所在的位置。所以引入以下原则:

  如果存储的是父类指针,那么从void*转换为有类型指针时一定也要是对应的父类。如果存储的是子类指针,那么一定要先转换为该子类对象。也就是在放入时时从什么类型转为void*的,在用的时候就一定要先转为什么类型。这个时候用动态类型转换就可以转为其他类型了。

子类中每一个直接继承的父类(包含虚函数)都会有一个vfptr指针,用于指向一个存放对应虚函数的列表,如果继承的父类也继承了其他类的虚函数,那么都会放在这个表中,顺序是由父类到子类。 虚继承的情况不同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值