结构体(struct)继承——[C++语言中]

2023-11-12

在C++语言中,struct对C语言中的strcut进行了扩充,已经不仅仅是一个包含不同数据类型的数据结构体了,在C++语言中,strcut可以包含成员函数,可以实现继承,可以实现多态。

在C++语言中,结构体struct与类class的最本质区别即为:默认方式控制,结构体struct默认是公有的,而类class默认是私有的。

实例代码:

struct TStructA

{

};

struct TStructB : TStructA

{

};

在该示例中,TStructB是public继承于TStructA的,将上述的strcut关键字改为class关键字,那么TStruct是private继承于TStrcutB的。推荐写程序时,public继承则标注为public,private继承则标注为private而不是采用strcut与class的默认访问权限的特性,例如:struct TStrcutB : public TStrcutA 。

结构体可以继承类,而类也可以继承结构体,这时的访问权限取决于子类或子结构体而非父类或福结构体,例如:

struct A{};

struct B : A {}; //public继承

class C : A {}; //private继承

struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体。它默认的访问控制是private的。虽然struct作为数据结构的实现体可以向class一样使用,但是在这里依旧将struct里的变量称为数据,class里的变量称为成员。使用struct或class完全依据个人的爱好,在程序中,将所有的class全部替换为struct,程序依旧可以正常运行。前提条件是:对于访问控制应该明确给出而不是依赖于默认访问控制特性,这既是一个良好的习惯,同时也可使代码更具可读性。

struct与class除了访问控制这一区别外,还有一点即为class关键字可用于定义模板参数,类似于typename,但struct不用于定义模板参数。

struct TstructA

{

 char c;

int a;

double d;

};

A obja = {'a', 12, 3.14}; //定义时直接赋值

struct 可以在定义时使用{} 进行赋初始值,若此时struct改为class则会报错。若在struct TStructA中添加一个构造函数或者虚函数,就会发现struct也不能使用{}赋初始值了。采用{}的方式进行赋初始值,只是用一个初始化列表来对数据进行按顺序的初始化,{'b', 11}也可以给数据 c 与 a 进行初始化,不对 d 进行初始化,像这种简单的copy的操作只能使用在简单的数据结构上,而不能使用在对象上。加入一个构造函数或虚函数使得struct体现出一种对象的特性,使得{}操作不再起作用。从本质上说,加入这样一个函数使得结构体的内部结构发生了变化。如果加入一个普通函数会发现{}赋初始值操作依旧可用,因为普通函数可被理解为数据结构的一种算法。

而将上面的struct改为class之后使得访问控制由public变为了private,自然而然{}直接赋初始化值就不能使用了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

结构体(struct)继承——[C++语言中] 的相关文章

  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • Nullable 是不可能的,为什么不呢? [复制]

    这个问题在这里已经有答案了 如果这是一个愚蠢的问题 请原谅 我正在尝试更好地理解 Net 中的 Nullable 类型 从我从 Microsoft 源代码 使用 ReSharper 中注意到的内容 我了解到 Nullable 是一个结构 而
  • EventHandler 应该始终用于事件吗?

    我一直在愉快地使用自定义委托类型和通用编写事件Action委托类型 没有真正考虑我在做什么 我有一些很好的扩展助手Action and EventHandler这使我倾向于使用那些预定义的委托类型而不是我自己的委托类型 但除此之外 除了惯例
  • 从另一个 FORM 中取回隐藏的 FORM

    我有两种形式Form1 and Form2 我正在打开Form2 from Form1 on button Click Form2 obj2 new Form2 this Visible false obj2 Show 然后我想回来Form
  • C# Outlook 从收件人获取 CompanyName 属性

    我目前正在使用 C 编写 Outlook 2010 AddIn 我想要的是从我从 AppointmentItem 中提取的 Recipient 对象中获取 CompanyName 属性 因此 有了 AppointmentItem 的收件人
  • DataGridView 列中的数字文本框

    我有一个DataGridView 我想要它的第一列或任何所需的列 其中有textboxes在其中 成为NUMERIC ONLY 我目前正在使用这段代码 private void dataGridViewItems EditingContro
  • 以下 PLINQ 代码没有改进

    我没有看到使用以下代码的处理速度有任何改进 IEnumerable
  • 从时间列表中查找最接近的时间

    所以 这是场景 我有一个带有创建时间的文件 我想从该文件的创建时间最接近或相等的时间列表中选择一个时间 完成此操作的最佳方法是什么 var closestTime listOfTimes OrderBy t gt Math Abs t fi
  • make_shared<>() 中的 WKWYL 优化是否会给某些多线程应用程序带来惩罚?

    前几天我偶然看到这个非常有趣的演示 http channel9 msdn com Events GoingNative GoingNative 2012 STL11 Magic Secrets作者 Stephan T Lavavej 其中提
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t
  • 检测 TextBox 中的 Tab 键按下

    I am trying to detect the Tab key press in a TextBox I know that the Tab key does not trigger the KeyDown KeyUp or the K
  • 为什么 std::function 不是有效的模板参数,而函数指针却是?

    我已经定义了名为的类模板CallBackAtInit其唯一目的是在初始化时调用函数 构造函数 该函数在模板参数中指定 问题是模板不接受std function作为参数 但它们接受函数指针 为什么 这是我的代码 include
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • 在 Qt 中播放通知(频率 x)声音 - 最简单的方法?

    Qt 5 1 或更高版本 我需要播放频率为 x 的通知声音 n 毫秒 如果我能像这样组合音调那就太好了 1000Hz 持续 2 秒 然后 3000Hz 持续 1 秒 最简单的方法是使用文件 WAV MP3 例如如此处所述 如何用Qt播放声音
  • 用数组或向量实现多维数组

    我想使用单个数组或向量实现多维数组 可以像通常的多维数组一样访问它 例如 a 1 2 3 我陷入困境的是如何实施 操作员 如果数组的维数为 1 则 a 1 应该返回位于索引 1 处的元素 但是如果维数大于一怎么办 对于嵌套向量 例如 3 维
  • 在 C 中使用 #define 没有任何价值

    If a define没有任何价值地使用 例如 define COMMAND SPI 默认值是0吗 不 它的评估结果为零 从字面上看 该符号被替换为空 然而 一旦你有了 define FOO 预处理器条件 ifdef FOO现在将是真的 另
  • 运行 xunit 测试时无法将输出打印到控制台窗口

    public class test2InAnotherProject private readonly ITestOutputHelper output public test2InAnotherProject ITestOutputHel
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request
  • 如何在 Razor 编辑视图中显示选中的单选按钮 Asp net core mvc

    尽管 Razor 视图中的 Asp 网络核心代码 model List

随机推荐

  • vue3.0+Ts+全局自定义指令实现动态按钮【操作】

    1 介绍 本文采用vue3 0 Ts 全局自定义指令实现动态按钮 操作 应用场景为后端发送动态菜单 操作 操作信息存放在路由的meta中并将路由存在vuex中 模板文件使用全局自定义指令动态判断是否显示该按钮 2 编写路由相关内容 2 1
  • 使用python进行十大排序算法图文详解【阅读数篇文章后集优】

    本文通过阅读 观看大量文章和视频 筛选出较优质的文章并实际运行 验证代码而作 文章部分内容进行了参考 阅读的大量文章中不乏水文 就算文章不错的也有部分错误 使得读者难以理解或理解错误 这也是我作此文的目的 文末附有这些我觉得比较好的文章的链
  • python目标检测答案_Python OpenCV 3 使用背景减除进行目标检测

    背景减除 Background Subtraction 是许多基于计算机视觉的任务中的主要预处理步骤 如果我们有完整的静止的背景帧 那么我们可以通过帧差法来计算像素差从而获取到前景对象 但是在大多数情况下 我们可能没有这样的图像 所以我们需
  • c语言判断格式是否IPv6

    int net is validipv6 const char hostname struct sockaddr in6 addr if hostname return 1 if strchr hostname return 1 暂时排除
  • C# 使用RestSharp实现Postman中的各种形式的请求

    目录 一 导入命名空间 二 构建客户端 创建客户端对象 设置当前URL 设置响应超时 添加默认Header 添加单项Cookie 添加多项Cookie 三 构建请求 创建请求对象 添加参数Header 添加单项Cookie 添加多项Cook
  • ffmpeg为视频设置透明度的几种方案

    ffmpeg命令目录 方案一 推荐 在这里插入图片描述 https img blog csdnimg cn 20190618215408132 gif pic center 方案二 对图片有效 经过测试 同方案二 只是先将视频转换成一张张帧
  • Vue拖拽排序(el-table ajax返回数据)

  • Unity Bolt使用协程等待

    使用Unity bolt插件可以进行一些简单逻辑开发 本质上相当于把C 接口以图形化的方式进行调用 但是怎么使用协程进行等待呢 经过一些研究 可以使用继承WaitUnit的组件方式进行扩展 下面是具体的操作步骤 1 等待组件扩展 经过查找
  • 安装MMDetection

    文章目录 前言 MMDetection介绍 MMDetection 整体构建流程和思想 其他信息 参考博客 前言 记录安装MMDetection MMDetection介绍 MMDetection 整体构建流程和思想 这里引用知乎回答图片
  • 企业微信自建应用通过PHP进行收发消息

    我们在企业微信的使用中肯定会用到自建应用 自建应用使用最多的功能就是消息的推送 使用的场景也有很多 例如 在公司内网的程序 可以监控员工在什么时候进行了敏感操作 比如某管理员删除了帐号或者其他内容 可以在进行操作时候推送一条消息到自建应用上
  • 基于GPU的三维体素化

    详情请看我的个人博客的体素化Voxelization 基于GPU的三维体素化
  • Power BI区域可视化(中国、各省市、各区县)

    1 制作SVG地图元件 Axure 复制到 Axure 的全国 含省 市 区 SVG 地图元件 PNG TO SVG 从复制到 Axure 的全国 含省 市 区 SVG 地图元件上截图 另存为PNG PNG TO SVG 设置SVG pat
  • Linux运维面试精选题库(一)

    运维精选面试题 1 什么是数据库 DB DataBase 数据库 依照某种数据模型进行组织并存放到存储器的数据集合 DBMS DataBase Management System 数据库管理系统 用来操纵和管理数据库的大型服务 软件 DBS
  • 手把手教你使用USB的CDC+MSC复合设备(基于stm32f407)- 2

    接上文 手把手教你使用USB的CDC MSC复合设备 基于stm32f407 此文主要是记录一下usb枚举时抓取的一些数据以及usb msc涉及的部分scsi协议 USB MSC协议 主要包括usb协议 msc类协议 scsi协议 SDIO
  • Python序列化protobuf中的repeated数据

    基本数据类型 append追加数据即可 clientRequestBody ids append 1 clientRequestBody ids append 2 如果ids需要的数据类型是列表 用extend 方法即可 具体参见exten
  • 【网络编程】揭开套接字的神秘面纱

    文章目录 1 peach 简单理解TCP UDP协议 peach 2 peach 网络字节序 peach 3 peach socket编程接口 peach 3 1 apple socket 常见API apple 3 2 apple soc
  • 激光雷达处理简介

    目录 1 什么是激光雷达 2 什么是点云 3 激光雷达的类型 4 激光雷达技术的优势 5 激光雷达处理概述 6 激光雷达技术的应用 1 什么是激光雷达 激光雷达 即激光探测和测距 是一种三维激光扫描方法 激光雷达传感器提供有关环境的三维结构
  • 如何将PC电脑变成web服务器:将内网主机映射到外网实现远程访问

    如何将PC电脑变成web服务器 将内网主机映射到外网实现远程访问 我是艾西 今天跟大家分享内容还是比较多人问的一个问题 如何将PC电脑变成web服务器 内网主机作为web服务器 内容包括本地内网映射 多层内网映射解决方案 绕过电信80端口封
  • C++运算符重载(简单易懂)

    一 运算符重载 对已有的运算符进行重新定义 赋予另一种功能以适用不同的数据类型 1 加号运算符 重载 创建类 Person class Person public 1 成员函数重载 号 本质 Person p3 p1 operator p2
  • 结构体(struct)继承——[C++语言中]

    在C 语言中 struct对C语言中的strcut进行了扩充 已经不仅仅是一个包含不同数据类型的数据结构体了 在C 语言中 strcut可以包含成员函数 可以实现继承 可以实现多态 在C 语言中 结构体struct与类class的最本质区别