C++ 类型兼容规则

news2024/11/24 16:24:37

类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。 通过公有继承,派生类得到了基类中除构造函数和析构函数之外的所有成员。这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。类型兼容规则中指的替代包括以下的情况:

(1)派生类的对象可以隐含转换为基类对象
(2)派生类的对象可以初始化基类的引用
(3)派生类的指针可以隐含转换为基类的指针

在替代之后,派生类对象就可以作为基类对象使用,但只能使用从基类继承的成员。

如果B类为基类,D为B的公有派生类,则D类中包含了基类B中除构造函数和析构函数之外的所有成员。这时根据类型兼容规则,在基类B的对象可以出现在任何地方,都可以用派生类D的对象来替代。

在如下程序中,b1为B类的对象,d1为D类的对象

class B{...};
class D:public B{...};

B b1;
B *p1;
D d1;

这时:
(1)派生类对象可以隐含转换为基类对象,即用派生类对象中从基类继承来的成员,逐个赋值给基类对象成员:

b1=d1;

(2)派生类对象也可以初始化基类对象的引用:

B &rb=d1;

(3)派生类对象的地址可以隐含转换为指向基类的指针:

p1=&d1;

由于类型兼容规则的引入,对于基类及其公有派生类对象,可以使用相同的函数统一处理。因为当函数的形参为基类的对象(或引用、指针)时,实参可以是派生类的对象(或指针),而没有必要为每一个类设计单独的模块,大大提高了程序效率。

【例】类型兼容规则实例
基类A以公有继承方式派生出B类,B类再作为基类以公有继承方式派生出C类。基类A中定义了成员函数display(),在派生类中对这个成员函数进行了隐藏。

class A//基类A定义
{
public:
	void display()const
	{
		cout << "显示类A" << endl;
	}
};

class B :public A//公有派生类B定义
{
public:
	void display()const
	{
		cout << "显示类B" << endl;
	}
};

class C :public B//公有派生类C定义
{
public:
	void display()const
	{
		cout << "显示类C" << endl;
	}
};

void fun(A* p)//参数为指向基类A的对象的指针
{
	p->display();//"对象指针->成员名"
}

int main()
{
	A a;
	B b;
	C c;

	fun(&a);
	fun(&b);
	fun(&c);

	return 0;
}

运行结果:
在这里插入图片描述
这样,通过“对象名.成员名”或者“对象指针->成员名”的方式,就应该可以访问到各派生类中继承自基类的成员。虽然根据类型兼容规则,可以将派生类对象的地址赋值给基类A的指针,但是通过这个基类类型的指针,却只能访问到从基类继承的成员。

在程序中,声明了一个形参为基类A类型的指针的普通函数fun,根据类型兼容兼容规则,可以将公有派生类对象的地址赋值给基类类型的指针,这样,使用fun函数就可以同一对这个类族中的对象进行操作。在程序运行过程中,分别把基类对象、派生类B的对象和派生类C的对象的地址赋值给基类类型的指针p,但是通过p,只能使用继承下来的基类成员。也就是说,尽管指针指向派生类C的对象,fun函数运行时通过这个指针只能访问到C类从基类A继承过来的成员函数display,而不是C类自己的同名成员函数。因此,主函数中3次调用fun的结果是相同的——访问了基类的公有成员函数。

通过这个例子可以看出,根据类型兼容规则,可以在基类对象出现的任何场合使用派生类对象进行替代,但是替代之后派生类对象仅仅发挥出基类对象的作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/841562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QA | 关于手持式频谱仪,您想了解的那些技术问题(二)

Q1&#xff1a;手持式频谱仪的灵敏度多高&#xff1f;底噪多少&#xff1f; 0.01-3GHz手持频谱仪的底噪/灵敏度为-128dBm RBW10kHz&#xff08;即归一化到Hz为-168dBm/Hz&#xff09;&#xff1b;2-8GHz手持频谱仪的底噪/灵敏度为-119dBm RBW30kHz&#xff08;即归一化到Hz为…

Javascript 数据结构[入门]

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于海外某世界知名高校就读计算机相关专业。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。…

JVM之类加载与字节码(一)

1.类文件结构 一个简单的HelloWorld.Java package cn.itcast.jvm.t5; // HelloWorld 示例 public class HelloWorld { public static void main(String[] args) { System.out.println("hello world"); } }编译为 HelloWorld.class 后的样子如下所示&#xff1a; […

最小二乘问题和非线性优化

最小二乘问题和非线性优化 0.引言1.最小二乘问题2.迭代下降法3.最速下降法4.牛顿法5.阻尼法6.高斯牛顿(GN)法7.莱文贝格马夸特(LM)法8.鲁棒核函数 0.引言 转载自此处&#xff0c;修正了一点小错误。 1.最小二乘问题 在求解 SLAM 中的最优状态估计问题时&#xff0c;我们一般…

ModaHub魔搭社区:大模型落地需要“记忆力”,这家公司想为向量数据库Milvus Cloud正名

现实生活中若两人进行对话,大致需要三步流程:一方首先抛出话题作引子;另一方会先调动记忆判断自己是否了解这个话题,然后再分析给出应该做出何种回答。如此循环往复直到互动结束,而此次对话又会作为一种新的“记忆”被双方吸收。 为让计算机完成这样的互动过程,并持续…

【云原生】Docker-Compose全方面学习

目录 1.compose简介 Compose V2 2.compose安装与下载 二进制包 PIP 安装 bash 补全命令 卸载 3.docker compose管理命令 命令对象与格式 命令选项 命令使用说明 1.compose简介 Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose&#xff0c;您可…

设计模式之策略模式(Strategy)

一、概述 定义一系列的算法&#xff0c;把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的类而变化。 二、适用性 1.许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。 2.需要使用一个算法的不同变体。…

Crowd-Robot Interaction 论文阅读

论文信息 题目&#xff1a;Crowd-Robot Interaction:Crowd-aware Robot Navigation with Attention-based Deep Reinforcement Learning 作者&#xff1a;Changan Chen, Y uejiang Liu 代码地址&#xff1a;https://github.com/vita-epfl/CrowdNav 来源&#xff1a;arXiv 时间…

面试测试开发被问到数据库索引不知道怎么办?

提出的问题 什么情况下创建索引&#xff0c;什么时候不需要索引&#xff1f; 索引的种类有哪些&#xff1f; 什么是索引 索引就是帮助数据库管理系统高效获取数据的数据结构&#xff0c;就好比一本书的目录&#xff0c;它可以帮我们快速进行特定值的定位与查找&#xff0c;…

软件架构师高级——3、数据库系统

• 数据库概述&#xff08;★★★&#xff09; 集中式数据库系统 •数据管理是集中的 •数据库系统的素有功能 &#xff08;从形式的用户接口到DBMS核心&#xff09; 者口集中在DBMS所在的计算机。 B/S结构 •客户端负责数据表示服务 •服务器主要负责数据库服务 •数据 和后端…

IC人才“疯狂”抢购:月薪开到7.5万的背后是什么?

随着人工智能和电动汽车等技术的快速发展&#xff0c;集成电路&#xff08;IC&#xff09;人才成为汽车行业的抢手货。近年来&#xff0c;车企对于IC人才的需求越来越大&#xff0c;导致月薪飙升到了7.5万的惊人高薪水。这个话题引起了广泛关注&#xff0c;下面我们将从供需关系…

卤味行业市场分析,绝味、周黑鸭、嘴尚绝谁能脱颖而出

随着人们生活水平的提高&#xff0c;卤味市场不断发展壮大&#xff0c;成为我国食品行业中一个重要的组成部分。根据国家统计局数据&#xff0c;截至2020年底&#xff0c;我国卤味店数量已经达到了8.4万家&#xff0c;总产值超过1600亿元。 卤味行业的特点 产品口味丰富&#…

布基纳法索ECTN(BESC)申请流程

根据BURKINA FASO布基纳法索签发于 11/07/2006法令编号 00557的规定: 自2006年11月07 日起所有出口至布基纳法索&#xff08;Burkina Faso&#xff09;的货物&#xff0c;必须申请ECTN/BESC。ECTN是ELECTRONIC CARGO TRACKING NOTE的英文缩写&#xff0c;BESC是BORDEREAU DE SU…

《大型网站技术架构设计》第二篇 架构-性能

不同视角下的网站性能 1、用户 从用户角度&#xff0c;网站性能就是用户在浏览器上直观感受到的网站响应速度快还是慢。用户感受到的时间。 2、开发人员 开发人员关注的主要是应用程序本身及其相关子系统的性能&#xff0c;包括响应延迟、系统吞吐量、并发处理能力、系统稳定…

Redis实战案例25-附近商铺功能

1. GEO数据结构 Redis中Geohash功能应用 添加地理坐标 求两点之间距离 搜索天安门附近10km的火车站&#xff0c;按升序 2. 导入店铺数据到GEO Redis中存储店铺的信息&#xff0c;将店铺的id和经纬度坐标存到GEO数据类型中去&#xff0c;其中member存id&#xff0c;经纬度对应…

关于自动化测试用例失败重试的一些思考

自动化测试用例失败重跑有助于提高自动化用例的稳定性&#xff0c;那我们来看一下&#xff0c;python和java生态里都有哪些具体做法&#xff1f; 怎么做 如果是在python生态里&#xff0c;用pytest做测试驱动&#xff0c;那么可以通过pytest的插件pytest-rerunfailures来实现…

第十三次CCF计算机软件能力认证

第一题&#xff1a;跳一跳 近来&#xff0c;跳一跳这款小游戏风靡全国&#xff0c;受到不少玩家的喜爱。 简化后的跳一跳规则如下&#xff1a;玩家每次从当前方块跳到下一个方块&#xff0c;如果没有跳到下一个方块上则游戏结束。 如果跳到了方块上&#xff0c;但没有跳到方块的…

Python(七十一)集合的概述与创建

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

自然语言处理:长文本场景下的关键词抽取实践

NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型压缩算法等 专栏详细介绍:NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型…

第四章 kernel函数基础篇

cuda教程目录 第一章 指针篇 第二章 CUDA原理篇 第三章 CUDA编译器环境配置篇 第四章 kernel函数基础篇 第五章 kernel索引(index)篇 第六章 kenel矩阵计算实战篇 第七章 kenel实战强化篇 第八章 CUDA内存应用与性能优化篇 第九章 CUDA原子(atomic)实战篇 第十章 CUDA流(strea…