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

这篇具有很好参考价值的文章主要介绍了【C/C++】父类指针指向子类对象 | 隐藏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

【C/C++】父类指针指向子类对象 | 隐藏,C/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()函数

【C/C++】父类指针指向子类对象 | 隐藏,C/C++,c语言,c++,开发语言,学习,笔记

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

【C/C++】父类指针指向子类对象 | 隐藏,C/C++,c语言,c++,开发语言,学习,笔记

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

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

	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++的多态


【C/C++】父类指针指向子类对象 | 隐藏,C/C++,c语言,c++,开发语言,学习,笔记文章来源地址https://www.toymoban.com/news/detail-675795.html

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

到了这里,关于【C/C++】父类指针指向子类对象 | 隐藏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c语言编程中出现错误: 表达式必须包含指向对象的指针类型。 该错误如何解决? 下文解答

    表达式必须包含指向对象的指针类型,但他具有类型\\\"int\\\" 具体原因是因为arr数组本质是一个指针类型,指向的是首元素的地址,如果用int 来接收显然不合适,以至于在引用下列定义的int类型的变量时候产生错误——表达式必须包含指向对象的指针类型,但他具有类型\\\"int\\\",解决

    2024年02月11日
    浏览(48)
  • Java 强制类型转换原理(父类转子类、子类转父类)

    在Java中,对象的强制转换(也称为类型转换)是将一个对象的引用转换为另一个类的引用,前提是这两个类之间存在继承或实现关系。强制转换可能会导致运行时异常,因为在转换的过程中,如果对象的实际类型与转换的目标类型不兼容,就会抛出ClassCastException异常。 分析

    2024年02月07日
    浏览(36)
  • C语言:指向数组的指针和指向数组首元素的指针

    相关阅读 C语言 https://blog.csdn.net/weixin_45791458/category_12423166.html?spm=1001.2014.3001.5482         指向数组的指针和指向数组首元素的指针常常被混淆,或者笼统地被称为数组指针,但它们之间是有差别的,本文就将对此进行讨论。         下面的代码首先创建了一个数组,然后创

    2024年02月02日
    浏览(52)
  • 表达式必须包含指向对象的指针类型,但他具有“int“?

       xdm,今天在写逆序函数的时候遇到了这样一个问题——表达式必须包含指向对象的指针类型,但他具有\\\"int\\\"?原来问题出在这里...    首先来看看题目   就在第三个函数的时候,我遇到了以下这样的问题   一个简单的逆序函数逻辑没出错,那一定是哪里输入错误,通过警告

    2024年02月16日
    浏览(44)
  • C语言指针操作(六)指向函数的指针

    指向函数的指针详解,以及如何使用指向函数的指针变量做函数参数 指向函数的指针作为函数参数,是 C 语言实际应用中的一个比较深入的部分。 目录 一、什么是函数的指针 二、用函数指着变量调用函数 2.1举例说明 三、怎样定义和使用指向函数的指针变量 3.1定义指向函数

    2024年02月05日
    浏览(55)
  • C++ | 继承(基类,父类,超类),(派生类,子类)

    文章参考:https://blog.csdn.net/war1111886/article/details/8609957 一 .继承中的访问权限关系 1.基类,父类,超类是指被继承的类,派生类,子类是指继承于基类的类.  2.在C++中使用: 冒号表示继承,如class A : public B;表示派生类A从基类B继承而来 3.派生类包含基类的所有

    2024年02月15日
    浏览(42)
  • 8.5 【C语言】指向函数的指针

    每次调用函数时都从该地址入口开始执行此段函数代码。函数名代表函数的起始地址。 例8.22 用函数求整数a和b中的大者 解题思路:在主函数调用max函数,除了可以通过函数名调用外,还可以通过指向函数的指针变量来实现。 (2)通过指针变量调用它所指向的函数 类型名(

    2024年02月11日
    浏览(32)
  • c++和QT子类调用父类方法

    c++调用方式 : 父类名::方法名 QT调用方式 : __super::方法

    2024年02月13日
    浏览(48)
  • C# 中什么是重写(子类改写父类方法)

    方法重写是指在继承关系中,子类重新实现父类或基类的某个方法。这种方法允许子类根据需要修改或扩展父类或基类的方法功能。在面向对象编程中,方法重写是一种多态的表现形式,它使得子类可以根据不同的需求和场景提供不同的方法实现。 方法重写的基本规则如下:

    2024年02月09日
    浏览(49)
  • Java feign接口调用后返回子类,序列化子类反序列化只得到父类

    需要修改序列化方法 我存的时候放的子类,接收到却是只有父类的数据 feign默认使用jackson进行序列化,需要在父类上加上注解 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) 在父类头上增加注解: https://blog.csdn.net/qq_39493105/article/details/126061848

    2024年02月14日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包