当前位置: 首页 > news >正文

【C++】继承 ⑥ ( 继承中的构造函数和析构函数 | 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

文章目录

  • 一、public 公有继承 - 示例分析
    • 1、类型兼容性原则
    • 2、类型兼容性原则应用场景
  • 二、类型兼容性原则 - 示例分析
    • 1、父类指针 指向 子类对象
    • 2、使用 子类对象 为 父类对象 进行初始化
    • 3、完整代码示例






一、public 公有继承 - 示例分析




1、类型兼容性原则


类型兼容性原则 : C++ 的 " 类型兼容性原则 “ 又称为 ” 赋值兼容性原则 " ;

子类代替父类 : 需要 基类 ( 父类 ) 对象的 地方 , 都可以使用 " 公有继承 " 的 派生类 ( 子类 ) 对象 替代 , 该 派生类 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外的 所有 成员变量 和 成员方法 ;

功能完整性 : " 公有继承 " 的 派生类 ( 子类 ) 本质上 具有 基类 ( 父类 ) 的 完整功能 , 使用 基类 可以解决的问题 , 使用 公有继承派生类 都能解决 ;


特别注意 : " 保护继承 " 和 " 私有继承 " 的 派生类 , 是 不具有 基类 的 完整功能的 , 因为 最终继承 后的派生类 , 无法在 类外部调用 父类的 公有成员 和 保护成员 ;


2、类型兼容性原则应用场景


" 类型兼容性原则 " 应用场景 :

  • 直接使用 : 使用 子类对象 作为 父类对象 使用 ;
  • 赋值 : 将 子类对象 赋值给 父类对象 ;
  • 初始化 : 使用 子类对象 为 父类对象 初始化 ;
  • 指针 : 父类指针 指向 子类对象 , 父类指针 值为 子类对象 在 堆内存 的地址 , 也就是 将 子类对象 地址 赋值给 父类类型指针 ;
  • 引用 : 父类引用 引用 子类对象 , 将 子类对象 赋值给 父类类型的引用 ;




二、类型兼容性原则 - 示例分析



定义父类 Parent , 子类 Child ;

class Parent {
public:void funParent(){cout << "父类 funParent 函数" << endl;}private:int c;
};// 子类 公有继承 父类
class Child : public Parent {
public:void funChild() {cout << "子类 funChild 函数" << endl;}
};

1、父类指针 指向 子类对象


定义 一个子类对象 Child child ;

定义父类的指针 , 将 指针 指向 子类对象 的地址 , 这是合法的 ;

代码示例 :

    // 父类对象Parent parent;// 子类对象Child child;// I. 类型兼容性原则 : 父类指针 指向 子类对象Parent* p_parent2 = NULL;p_parent2 = &child;

该原则的应用场景如下 : 定义函数 , 接收 父类指针 或 父类引用 , 此处可以直接传入 子类指针 或 子类引用 ;

// 函数接收父类指针类型
// 此处可以传入子类对象的指针
void fun_pointer(Parent* obj)
{obj->funParent();
}// 函数接收父类引用类型
// 此处可以传入子类对象的引用
void fun_reference(Parent& obj)
{obj.funParent();
}

2、使用 子类对象 为 父类对象 进行初始化


定义父类对象 , 可以直接使用 子类对象 进行初始化操作 ;

    // II. 类型兼容性原则 : 使用 子类对象 为 父类对象 进行初始化Parent parent = child;

3、完整代码示例


#include "iostream"
using namespace std;class Parent {
public:void funParent(){cout << "父类 funParent 函数" << endl;}private:int c;
};// 子类 公有继承 父类
class Child : public Parent {
public:void funChild() {cout << "子类 funChild 函数" << endl;}
};// 函数接收父类指针类型
// 此处可以传入子类对象的指针
void fun_pointer(Parent* obj)
{obj->funParent();
}// 函数接收父类引用类型
// 此处可以传入子类对象的引用
void fun_reference(Parent& obj)
{obj.funParent();
}int main() {// 父类对象Parent parent;// 子类对象Child child;// 父类对象 可以调用 父类公有函数parent.funParent();// 子类对象 可以调用 子类自身公有函数child.funChild();// 子类对象 可以调用 父类公有函数child.funParent();// 将指向子类对象的指针传给接收父类指针的函数// 也是可以的fun_pointer(&child);// 接收父类引用 , 此处传入子类引用fun_reference(child);// 赋值兼容性原则 : cout << "\n赋值兼容性原则示例 : \n" << endl;// 常规操作 : 父类指针 指向 父类对象Parent* p_parent = NULL;p_parent = &parent;// 通过父类指针调用父类函数p_parent->funParent();// 将指向子类对象的指针传给接收父类指针的函数// 也是可以的fun_pointer(p_parent);// 接收父类引用参数fun_reference(*p_parent);// I. 类型兼容性原则 : 父类指针 指向 子类对象Parent* p_parent2 = NULL;p_parent2 = &child;// 通过父类指针调用父类函数p_parent2->funParent();// II. 类型兼容性原则 : 使用 子类对象 为 父类对象 进行初始化Parent parent3 = child;// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
}

执行结果 :

父类 funParent 函数
子类 funChild 函数
父类 funParent 函数
父类 funParent 函数
父类 funParent 函数赋值兼容性原则示例 :父类 funParent 函数
父类 funParent 函数
父类 funParent 函数
父类 funParent 函数
Press any key to continue . . .

在这里插入图片描述

相关文章:

【C++】继承 ⑥ ( 继承中的构造函数和析构函数 | 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

文章目录 一、public 公有继承 - 示例分析1、类型兼容性原则2、类型兼容性原则应用场景 二、类型兼容性原则 - 示例分析1、父类指针 指向 子类对象2、使用 子类对象 为 父类对象 进行初始化3、完整代码示例 一、public 公有继承 - 示例分析 1、类型兼容性原则 类型兼容性原则 :…...

15 | JPA 对 Web MVC 开发者做了哪些支持

我们使用 Spring Data JPA 的时候&#xff0c;一般都会用到 Spring MVC&#xff0c;Spring Data 对 Spring MVC 做了很好的支持&#xff0c;体现在以下几个方面&#xff1a; 支持在 Controller 层直接返回实体&#xff0c;而不使用其显式的调用方法&#xff1b;对 MVC 层支持标…...

链表的概念+MySingleList的实现

文章目录 链表一、 链表的概念1.概念2. 结构 二、MySingleList的实现1 .定义内部类2 .创建链表3. 遍历链表并打印4.查找单链表中是否包含关键字key5.得到链表的长度6.头插法7. 尾插法8.任意位置插入8.删除结点清空 链表 顺序存储&#xff1a;顺序表/ArrayList 优点&#xff1…...

小黑子—Maven基础

Maven基础 一 小黑子的Maven学习1. Mavn的介绍2. Maven基础概念2.1 仓库2.2 坐标2.3 仓库配置 3. 手动写一个maven项目3.1 Maven项目构建命令3.2 插件创建工程 4. IDEA下的maven项目5. 依赖管理5.1 依赖配置5.2 依赖传递5.3 可选依赖&#xff08;不透明&#xff09;5.4 排除依赖…...

【Netty专题】【网络编程】从OSI、TCP/IP网络模型开始到BIO、NIO(Netty前置知识)

目录 前言前置知识一、计算机网络体系结构二、TCP/IP协议族2.1 简介*2.2 TCP/IP网络传输中的数据2.3 地址和端口号2.4 小总结 三、TCP/UDP特性3.1 TCP特性TCP 3次握手TCP 4次挥手TCP头部结构体 3.2 UDP特性 四、总结 课程内容一、网络通信编程基础知识1.1 什么是Socket1.2 长连…...

扬帆起航:许战海方法论日文版正式发布

近日&#xff0c;中国头部战略咨询机构‘许战海咨询’最新研究成果《中国汽车行业新能源转型战略》行业白皮书日文版&#xff0c;即将在日本发布。同时发布的日文版核心方法论白皮书还有《主品牌进化战略》、《第二招牌增长战略》、《链主品牌&#xff1a;制造业的竞争之王》等…...

Docker 安装zookeeper

一、安装单机版 1、拉取镜像 docker pull zookeeper2、创建挂载目录 mkdir -p /mydata/zookeeper/{conf,data,logs}3、新建配置文件 cd /mydata/zookeeper/conf vi zoo.cfgdataDir/data dataLogDir/logs tickTime2000 initLimit10 syncLimit5 clientPort21814、单机主机启…...

项目管理与SSM框架(二)| Spring

Spring简介 Spring是一个开源框架&#xff0c;为简化企业级开发而生。它以IOC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面&#xff09;为思想内核&#xff0c;提供了控制层 SpringMVC、数据层SpringData、服务层事务管理等众多技术&#xff0c;并可以整合众多…...

Ubuntu系统忘记Root用户密码-无法登录系统-更改Root密码-Ubuntu系统维护

一、背景 很多时候&#xff0c;我们总会设计复杂的密码&#xff0c;但是大多数时候&#xff0c;我们反而会先忘记我们的密码&#xff0c;导致密码不仅仅阻挡其他用户进入系统&#xff0c;同时也阻碍我们进入系统。 本文将介绍在忘记密码的情况下&#xff0c;如何进入系统并更改…...

webSocket 有哪些安全问题?

WebSocket在实现实时通信和双向数据传输方面非常有用&#xff0c;但也存在一些安全问题需要注意。以下是一些与WebSocket相关的安全问题&#xff1a; 1&#xff1a;跨站脚本攻击&#xff08;XSS&#xff09;&#xff1a; WebSocket在消息传递过程中可能传输恶意脚本&#xff…...

ArcGis打开影像显示全黑解决方法

我们加载图像&#xff0c;显示如下&#xff1a; 解决方法&#xff1a; 问题分析&#xff1a;Gamma值高于1影像亮化&#xff0c;低于1影像暗化。栅格影像导入进来呈现黑色&#xff0c;可能是因为影像的“Gamma校正”设置出现问题&#xff0c;影响了影像的拉伸度、亮度、对比度等…...

雷达基础导论及MATLAB仿真

文章目录 前言一、雷达基础导论二、Matlab 仿真1、SNR 相对检测距离的仿真①、Matlab 源码②、仿真1&#xff09;、不同 RCS&#xff0c;SNR 相对检测距离仿真2&#xff09;、不同雷达峰值功率&#xff0c;SNR 相对检测距离仿真 2、脉冲宽度相对所要求的 SNR 仿真①、Matlab 源…...

设计模式再探——适配器模式

目录 一、背景介绍二、思路&方案三、过程1.适配器模式简介2.适配器模式的类图3.适配器模式代码4.适配器模式&#xff0c;类适配器模式和对象的对比5.适配器模式终极奥秘 四、总结五、升华 一、背景介绍 最近公司在对业务模型做构建的时候&#xff0c;涉及到和三方系统的对…...

【无标题】光伏逆变器的IEC62109测试,逆变器IEC62109测试项目

光伏逆变器的IEC62109测试&#xff0c;逆变器IEC62109测试项目 逆变器又称电源调整器&#xff0c;根据逆变器在光伏发电系统中的用途可分为独立型电源用和并网用二种。根据波形调制方式又可分为方波逆变器、阶梯波逆变器、正弦波逆变器和组合式三相逆变器。对于用于并网系统的…...

Windows用VM虚拟机安装MacOS Ventura 13.6系统全流程教程(附资源)

安装成果&#xff1a; 所需容量&#xff1a;至少40GB的硬盘空间&#xff0c;推荐80GB以上。 所需资源 VMware虚拟机激活密钥&#xff1a;VMware Workstation Pro 17.0.2MacOS Ventura 13.6的ISO镜像MacOS的解锁工具卡顿优化工具&#xff1a;beamoff 有人反馈说需要能用的ISO镜…...

PHP7和PHP8的新特性

PHP 7 新特性&#xff1a; 改进的性能&#xff1a;最显著的变化就是性能提升&#xff0c;据官方报告&#xff0c;PHP 7 的速度是 PHP 5.6 的两倍。 标量类型声明&#xff1a;PHP 7 添加了 int, float, string 和 bool 四种标量类型声明&#xff0c;这使得函数可以通过预定义参…...

mysql按照日期分组统计数据(date_formatstr_to_date)

学习链接 mysql按照日期分组统计数据 博主-山茶花开时的 【Mysql专栏学习】 mysql按照日期分组统计数据 Mysql的date_format函数想必大家都使用过吧&#xff0c;一般用于日期时间转化&#xff0c;如下所示 # 可以得出 2023-01-01 08:30:50 select DATE_FORMAT(2023-01-01…...

【C++程序员必修第一课】C++基础课程-07:switch 分支选择

1 本课主要内容&#xff1a; 为什么需要有 switch 多分支选择&#xff1f;应用场景在哪里&#xff1f;switch 多分支选择的应用讲解&#xff1a;case, break,default 2 主要知识点&#xff1a; 为什么需要有 switch 多分支选择 思考一个问题&#xff0c;数学老师需要统计班上同…...

initramfs介绍

initramfs介绍 什么是initramfs&#xff1f; initramfs&#xff08;Initial RAM Filesystem&#xff09;是一种临时文件系统&#xff0c;它在Linux系统启动过程中被加载到内存中。它包含了必要的驱动程序、工具和配置文件&#xff0c;用于在内核启动后挂载真实的根文件系统之…...

数据结构与算法:二分查找(心得)

前言 前些天我做了一道题目&#xff0c;题目中要求使用二分查找&#xff0c;我便按照我心中的二分查找&#xff0c;信心满满的提交上去了。结果发现无限循环&#xff0c;后面我便去查阅了资料 二分查找的条件 用于查找的内容需要是有序的查找的数量只能是一个 二分查找的二种方…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...

数据库正常,但后端收不到数据原因及解决

从代码和日志来看&#xff0c;后端SQL查询确实返回了数据&#xff0c;但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离&#xff0c;并且ai辅助开发的时候&#xff0c;很容易出现前后端变量名不一致情况&#xff0c;还不报错&#xff0c;只是单…...