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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/linfengmove/article/details/82769120

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

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

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

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

猜你喜欢

转载自blog.csdn.net/linfengmove/article/details/82769120