C++内存对象布局小测试

 更新时间:2023年12月08日 08:36:46   作者:柏下微雨  
这篇文章主要介绍了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++内存对象布局的资料请关注脚本之家其它相关文章!

相关文章

  • C++语法中的函数重载和默认参数

    C++语法中的函数重载和默认参数

    这篇文章主要介绍了C++语法中的函数重载和默认参数,本文从语法角度通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • C语言编程之三个方法实现strlen函数

    C语言编程之三个方法实现strlen函数

    本篇文章是C语言编程篇,主要为大家介绍C语言编程中实现strlen函数的三个方法讲解,有需要的朋友可以借鉴参考下,希望可以有所帮助
    2021-09-09
  • C语言编写简单的定时关机程序

    C语言编写简单的定时关机程序

    本文给大家分享的是一则C语言编写的简单的定时关机程序,可以设置0-600秒倒计时,有需要的小伙伴可以参考下。
    2016-02-02
  • 深入分析为Visual Assist设置快捷键的方法

    深入分析为Visual Assist设置快捷键的方法

    本篇文章是对为Visual Assist设置快捷键的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 图解AVL树数据结构输入与输出及实现示例

    图解AVL树数据结构输入与输出及实现示例

    这篇文章主要为大家介绍了C++图解AVL树数据结构输入与输出操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • C++解决输出链表中倒数k个结点的问题

    C++解决输出链表中倒数k个结点的问题

    这篇文章主要给大家介绍了关于如何利用C++解决输出链表中倒数k个结点的问题,文中通过实例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友可以参考下
    2021-12-12
  • 插入排序的顺序表实现代码

    插入排序的顺序表实现代码

    这篇文章主要介绍了插入排序的顺序表实现代码,有需要的朋友可以参考一下
    2014-01-01
  • c语言strftime时间格式化示例

    c语言strftime时间格式化示例

    C/C++程序中需要程序显示当前时间,可以使用标准函数strftime,本文提供一个示例供大家参考
    2014-02-02
  • VisualStudio2022配置opencv的实现

    VisualStudio2022配置opencv的实现

    本文主要介绍了VisualStudio2022配置opencv的实现,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • C++深入分析讲解函数与重载知识点

    C++深入分析讲解函数与重载知识点

    C++ 允许多个函数拥有相同的名字,只要它们的参数列表不同就可以,这就是函数的重载(Function Overloading),借助重载,一个函数名可以有多种用途
    2022-06-06

最新评论