【C/C++】父类指针指向子类对象 | 隐藏

news2024/11/15 19:32:18

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


目录

  • 一、隐藏
  • 二、父类指针指向子类对象

一、隐藏

在同一个类中,两个只有参数列表不同(同名同返回类型)的函数能构成函数重载,我们调用的时候,可以根据参数类型、参数个数,编译器自动匹配调用哪个函数。

例如:

class CTest 
{
	void fun();
	void fun(int a);
	void fun(char a);
}

如果在父类和子类中出现同名函数,由于在不同的类中即不同的作用域,即使函数的参数列表不同,也不能构成函数重载

这种情况称为隐藏

C++中,当一个派生类定义了一个和基类同名的成员函数时,基类的同名函数会被隐藏,这种现象称为隐藏

#include <iostream>
using namespace std;
class CFather
{
public:
	void fun()
	{
		cout << "CFather::fun()" << endl;
	}
};
class CSon :public CFather
{
public:
	void fun()
	{
		cout << "CSon::fun()" << endl;
	}
};
int main()
{
	CSon test; 
	test.fun();	//不是函数重载(不是同一个作用域) 自动匹配子类 不能匹配父类
	//隐藏	隐藏:子类定义了和父类同名的成员称之为隐藏
	return 0;
}

运行发现:子类对象调用函数时自动调用了子类中的fun()函数

在这里插入图片描述

在隐藏下,如果不使用类名作用域指定,在子类对象调用函数时,编译器会自动调用子类中的同名函数

在这里插入图片描述

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

在继承的条件下,父类的指针可以不通过强转指向子类对象:

	CSon son;
	CFather* const pthis = &son;	//在继承的条件下,父类的指针可以不通过强转直接指向子类对象
	pthis->fun();

反过来却不行:

	CFather fa;
	CSon* pson = &fa;	//error:子类的指针不能指向父类的对象

由于父类指针可以指向子类对象,父类指针就可以直接调用子类中的成员函数

父类的指针可以统一多个类的类型,提高代码的复用性、扩展性


例如:

CSheepCPigCDog类继承CPet,通过父类指针统一管理三种子类对象

使用一个父类指针调用共有的方法,即可省下大量重复代码:

#include <iostream>
#include <string>
using namespace std;
class CPet
{
public:
	int m_weight;
	void walk()
	{
		cout << "散步" << endl;
	}
	CPet()
	{
		m_weight = 20;
	}
};
class CSheep:public CPet
{
public:
	void like()
	{
		cout << "喜欢吃草" << endl;
	}
};
class CPig :public CPet
{
public:
	void like()
	{
		cout << "喜欢胡萝卜" << endl;
	}
};
class CDog :public CPet
{
public:
	void like()
	{
		cout << "喜欢骨头" << endl;
	}
};


//void fun(CSheep* pCS)
//{
//  cout <<"体重: " << pCS->m_weight << endl;
//	CS->like();
//	CS->walk();
//}
//void fun(CPig* pCP)
//{
//  cout <<"体重: " << pCP->m_weight << endl;
//	CP->like();
//	CP->walk();
//}
//void fun(CDog* pCD)
//{
//  cout <<"体重: " << pCD->m_weight << endl;
//	CD->like();
//	CD->walk();
//}
void fun(CPet *pCPet)		//父类的指针可以统一多种子类类型,减少代码的冗余,提高程序复用性、扩展性
{
	cout <<"体重: " << pCPet->m_weight << endl;
	//pCPet->like();	//父类的指针只能使用父类的成员,不能使用子类的成员    
	pCPet->walk();
}


int main()
{
	fun(new CSheep);
	fun(new CPig);
	fun(new CDog);
	void (CPet:: * p_CS)() = (void (CPet::*)()) & CSheep::like;
	CPet pet;
	(pet.*p_CS)();
	return 0;
}

也将实现C++的多态


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

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

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

相关文章

CleanMyMac最新版4.14Mac清理软件下载安装使用教程

苹果电脑是很多人喜欢使用的一种电脑&#xff0c;它有着优美的外观&#xff0c;流畅的操作系统&#xff0c;丰富的应用程序和高效的性能。但是&#xff0c;随着时间的推移&#xff0c;苹果电脑也会产生一些不必要的文件和数据&#xff0c;这些文件和数据就是我们常说的垃圾。那…

docker服务如何正确关停

说明&#xff1a;停止 docker 服务之前&#xff0c;先把所有的容器都停掉&#xff0c;如果没停掉&#xff0c;再重启 docker 服务之后&#xff0c;所有的容器就会成为 Exited 状态。如果你只是想停止 docker 服务&#xff0c;docker 中的容器还继续提供服务&#xff0c;需要在d…

NVIDIA DLI 深度学习基础 答案 领取证书

最后一节作业是水果分类的任务&#xff0c;一共6类&#xff0c;使用之前学习的知识在代码段上进行填空。 加载ImageNet预训练的基础模型 from tensorflow import kerasbase_model keras.applications.VGG16(weights"imagenet",input_shape(224, 224, 3),include_t…

首页搜索框传递参数,并在搜索页面中的搜索框中进行显示,搜索框绑定回车键进行搜索

实现搜索条件和搜索内容固定&#xff0c;以及回车键搜索跳转 1.写出搜索条件和搜索框 <form class"parent"><select id"searchSelect" style"border: 1px solid #325da7;border-right: none;" value"resource"><opt…

Mysql B+数索引结构

一、B树和B树区别 二、 B 树形成过程 三、页分裂过程 3.1 页分裂过程实例 3.1.1 原有数据1、3、5形成如下数据页 3.1.2 先新插入数据4&#xff0c;因为 页10 最多只能放3条记录所以我们不得不再分配一个新页&#xff1a; 新分配的数据页编号可能并不是连续的&#xff0c;也…

threejs特殊几何体(一:文字几何体对象)

threejs中文字几何体通过newTextGeometry&#xff08;&#xff09;生成&#xff0c;它被单独作为一个类存在于threejs中const txtGeo new TextGeometry("threejs", { ...opts, font: font }); 我们先看效果&#xff1a; <template><div></div> &…

RJ45接口的PCB设计布局布线注意事项

网口模块的组成主要包括了&#xff1a;RJ45网口、变压器、PHY芯片及主芯片&#xff1b;还有一种RJ45与变压器进行了集成&#xff0c;分别如图1、图2所示&#xff1b; 图1 网口模块组成-RJ45与变压器未集成 图2 网口模块组成-RJ45与变压器集成 我们常见的网口有百兆网口和千兆网…

MySQL学习笔记(八)—— 锁

首先要说明&#xff0c;有的锁是我们自己想加的时候加的&#xff0c;比如全局锁要靠我们自己用命令去加。而有的锁是mysql默认就给你加上了&#xff0c;因为mysql要保证自己最起码的安全性。 InnoDB默认加的是行级锁。 一、全局锁 1.1 用途 全局锁就是把所有的表都给锁了&am…

【UniApp开发小程序】私聊功能后端实现 (买家、卖家 沟通商品信息)【后端基于若依管理系统开发】

声明 本文提炼于个人练手项目&#xff0c;其中的实现逻辑不一定标准&#xff0c;实现思路没有参考权威的文档和教程&#xff0c;仅为个人思考得出&#xff0c;因此可能存在较多本人未考虑到的情况和漏洞&#xff0c;因此仅供参考&#xff0c;如果大家觉得有问题&#xff0c;恳…

Mac操作系统Safari 17全新升级:秋季推出全部特性

苹果的内置浏览器可能是Mac上最常用的应用程序&#xff08;是的&#xff0c;甚至比Finder、超级Mac Geeks还要多&#xff09;。因此&#xff0c;苹果总是为其浏览器Safari添加有用的新功能。在今年秋天与macOS Sonoma一起推出的第17版中&#xff0c;Safari可以帮助你提高工作效…

以getPositionList为例,查找接口函数定义及接口数据格式定义

job-app-master/pages/index/index.vue中299行 async getPositionList(type refresh, pulldown false) {this.status 请求中;if (type refresh) {this.query.page 1;} else {this.query.page;}let res await this.$apis.getPositionList(this.query);if (res) {if (type …

Oracle查锁表(史上最全)

Oracle查锁表 Oracle分两种锁&#xff0c;一种是DDL锁&#xff0c;一种是DML锁。一、Oracle DDL锁的解锁&#xff08;dba_ddl_locks视图&#xff09;1.1、查表的DDL锁的详情&#xff08;kill session脚本、表名、执行锁表的SQL等&#xff09;1.2、解锁表的DDL锁1.2.1、解锁表的…

202 | 抽象类、接口、内部类

抽象类 abstract 注意项 父类方法需要声明&#xff0c;但是有不确定性&#xff0c;考虑将该方法设计为抽象方法抽象方法没有实现的方法没有方法体&#xff08;跟接口的区别&#xff1f;&#xff09;抽象方法的类必须设置为抽象类&#xff0c;实现方法由其子类实现 abstract …

C语言指针入门详解

一、指针简介 指针(Pointer)是C语言的一个重要知识点&#xff0c;其使用灵活、功能强大&#xff0c;是C语言的灵魂指针与底层硬件联系紧密&#xff0c;使用指针可操作数据的地址&#xff0c;实现数据的间接访问指针就是地址&#xff0c;通过访问此地址来获取该地址存储的数据 …

AIGC人工智能涉及三十六职业,看看有没有你的职业(一)

文章目录 一只弹吉他的熊猫 神奇的企鹅 功夫熊猫 视觉光影下的女子 闪光灯效 局部柔光 生物光 LOGO设计 制作儿童绘本故事 换脸艺术 打造专属动漫头像 包装设计之美 建筑设计 如何转高清图 生成3D质感图标 生成微信表情包 探索美食摄影的奇妙之旅 蛋糕创意设…

docker-compose管理创建LNMP服务并运行Wordpress网站平台

文章目录 一&#xff0e;项目环境1. 环境描述2.项目需求 二&#xff0e;部署过程1.安装Docker2.安装Docker加速器3.Docker-Compose安装部署4.准备依赖文件、配置nginx5.配置mysql6.配置php7.编写docker-compose.yml8.验证 三.容器快照&#xff0c;然后将Docker镜像打包成tar包备…

Wireshark流量分析

目录 1.基本介绍 2.基本使用 1&#xff09;数据包筛选: 2&#xff09;筛选ip&#xff1a; 3&#xff09;数据包还原 4&#xff09;数据提取 3.wireshark实例 1.基本介绍 在CTF比赛中&#xff0c;对于流量包的分析取证是一种十分重要的题型。通常这类题目都是会提供一个包含…

Config:服务端连接Git配置

创建子模块 Pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org…

<C++> 内存管理

1.C/C内存分布 让我们先来看看下面这段代码 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] {1, 2, 3, 4};char char2[] "abcd";char *pChar3 "abcd";int *ptr1 (int *) mal…

Spring Cloud 2022.x版本使用gateway和nacos实现动态路由和负载均衡

文章目录 1、nacos下载安装1.1、启动服务器1.2、关闭服务器1.3、服务注册&发现和配置管理接口 2、代码示例2.1、app1工程代码2.2、app2工程代码2.3、gateway网关工程代码 3、动态配置网关路由3.1、配置动态路由3.2、配置为负载模式 4、gateway配置规则4.1、请求转发&#x…