C++内存对象布局小测试
作者:柏下微雨
这篇文章主要介绍了C++内存对象布局小测试,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
对象布局
如图:
布局测试
如果不了解的读者可以自行学习,在此我对对象布局做一些测试,代码如下:
class Point2D { public: Point2D(int x, int y) :x(x), y(y) {} Point2D(const Point2D& p) { cout << "copy2d" << endl; x = p.x, y = p.y; } virtual void print() const{ cout << x << " " << y << endl; } virtual ~Point2D() {} protected: int x; int y; }; class Point3D : public Point2D { public: Point3D(int x, int y, int z) :Point2D(x, y), z(z) {} virtual void print()const { cout << x << " " << y << " " << z << endl; } private: int z; }; int main() { Point2D* p2d = new Point3D(1, 2, 3); Point2D p2d2 = Point3D(1,2,3);//输出copy2d p2d->print();//1)输出为1,2,3 p2d2.print();//2)输出为1,2 Point2D p2d1 = *p2d;//输出copy2d p2d1.print();//3)输出为1,2 (*p2d).print();//4)输出为1,2,3 Point3D* p3d = p2d;//Point2D*类型的值不能用于初始化Point3D*类型的实体 }
分析
首先我们需要知道,为什么只有指针和引用可以实现多态,而普通的对象声明不可以。因为指针和引用并不指定所指对象的大小(指针本身只占8个字节),当把子类指针赋值给父类指针时(如main函数里第一句语句),不会报错,并且由于虚函数表的存在,父类指针成功间接访问到了子类定义的虚函数。
而将子类对象赋值给父类对象时(如main函数里第二句语句),实际上是调用了一个拷贝构造函数,并将子类转型为父类对象传进拷贝构造函数)自然无法产生多态。
再看3)的输出,其实和2)同理,调用拷贝构造函数
4)的输出自然也没有问题,取得同一个地址空间的虚函数。
参考:https://www.bilibili.com/video/BV1v64y1q7JT/?p=1&spm_id_from=...,《深度探索C++对象模型》
以上就是C++内存对象布局小测试的详细内容,更多关于C++内存对象布局的资料请关注脚本之家其它相关文章!