C++面向对象-18-继承中的对象模型和继承中构造和析构顺序

2024-06-11 10:32

本文主要是介绍C++面向对象-18-继承中的对象模型和继承中构造和析构顺序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前面一篇学习了继承,知道类子类虽然继承类父类的熟悉,但是不可以访问到父类的私有成员。那么我们先来讨论一个问题,子类是否继承了父类的私有成员变量呢?然后看看继承中子类的构造和父类的构造以及析构函数的执行顺序。

 

1.通过sizeof()函数来证明子类确实继承了父类的私有成员

直接来看下面代码

#include <iostream>
using namespace std;class Base
{public :int m_A;
protected:int m_B;
private:int m_C;
};class Sun : public Base
{
public:int m_D;
};void test01()
{cout << "Size of Sun= " << sizeof(Sun) << endl;
}int main()
{test01();system("pause");return 0;
}

运行结果得到:

结果是16,也就是四个int类型,说明子类Sun继承了父类的私有非静态成员变量m_C; 那为什么子类访问不了基类的私有成员呢,原来就是C++编译器隐藏了父类的私有成员,就是不让访问,就是这么设计的,实际上子类的确继承下来了父类的私有非静态成员变量m_C。

 

2.通过vs下自带一个工具来打印一个类的对象模型

这个工具是安装了VS自带的,通过输入一个命令: cl /d1 reportSingleClassLayoutXXX 类所在文件名称

2.1 在开始菜单下找到这个工具入口

然后cd到你当前工程所在文件夹,如果不是在C盘,先需要切换到其他盘符。

输入命令,例如:cl /d1 reportSingleClassLayoutSun Sun这个类所在文件的名称

这个工具很强大,第一个红圈显示这个类大小16字节,通过看第二个红圈,告示这是父类(上面单词base class)是Base,其中继承类基类的三个成员属性,包括私有m_C。

 

3.继承中构造函数和析构函数的执行顺序

之前学习单个类的时候,我们学习类构造函数和析构函数,并且知道了是先执行构造函数,然后执行析构函数。那么这个子类继承类父类,子类的构造和父类的构造哪个先执行,通过两个析构函数怎么执行顺序。

先看看这段代码的打印顺序,我们知道现有子类还是父类对象。

#include <iostream>
using namespace std;class Base
{public:Base(){cout << "Base类的构造函数调用了" << endl;}~Base(){cout << "Base类的析构函数调用了" << endl;}};class Sun : public Base
{
public:Sun(){cout << "Sun类的构造函数调用了" << endl;}~Sun(){cout << "Sun类的析构函数调用了" << endl;}
};void test01()
{Sun s;
}int main()
{test01();system("pause");return 0;
}

运行结果

总结:

继承中的构造和析构顺序
先执行父类构造,再构造子类
先执行子类析构,再父类析构

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

这篇关于C++面向对象-18-继承中的对象模型和继承中构造和析构顺序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1050916

相关文章

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表