创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥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:子类的指针不能指向父类的对象
由于父类指针可以指向子类对象,父类指针就可以直接调用子类中的成员函数
父类的指针可以统一多个类的类型,提高代码的复用性、扩展性
例如:
CSheep
和CPig
和CDog
类继承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++的多态…文章来源:https://www.toymoban.com/news/detail-675795.html
文章来源地址https://www.toymoban.com/news/detail-675795.html
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |
到了这里,关于【C/C++】父类指针指向子类对象 | 隐藏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!