重载、重写、重定义——三种同名函数的不同处理方式
时间:2022-07-24
本文章向大家介绍重载、重写、重定义——三种同名函数的不同处理方式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
重载、重写、重定义的区别:
重载
在一个类中的重名函数,由于函数参数个数/类型的不同(形参列表不同),导致使用不同的函数进行处理,这种情况称为重载
。
class A
{
public:
void show(){
cout << "show()" << endl;
}
void show(int x){
cout << "show(int x):"<< x << endl;
}
};
int main(){
A a;
a.show();
a.show(3);
}
对于重载函数,想调用哪个函数,取决于你给的参数。运行结果如下:
重定义(隐藏)
情况一
- 如果同名函数在不同的类中,则他们不再是重载函数,
- 若他们的形参列表不同,则基类中的同名函数将被隐藏(屏蔽)
class A
{
public:
void show(){
cout << "A--show()" << endl;
}
};
class B : public A
{
public:
void show(int x){
cout << "B--show()" << x << endl;
}
};
int main(){
B a;
//a.show();
//此时基类中的show()和子类中的函数同名而参数不同,
//满足隐藏的条件,子类从基类继承而来的没有参数的
//show()已经被隐藏了,无法调用
a.A::show();
a.show(5);
system("pause");
return 0;
}
情况二
- 同名函数在不同的类中、参数相同,且基类中的同名函数前没有virtual关键字声明,那么基类中的同名函数依然会被隐藏。
class A
{
public:
/* virtual */void show(){
cout << "A--show()" << endl;
}
};
class B : public A
{
public:
void show(){
cout << "B--show()" << endl;
}
};
int main(){
B a;
a.show();
system("pause");
return 0;
}
class A
{
public:
/* virtual */void show(){
cout << "A--show()" << endl;
}
};
class B : public A
{
public:
};
int main(){
B a;
a.show();
system("pause");
return 0;
}
对照上边两个程序:
- 当子类中有与基类同名的参数,并且没有
virtual
修饰就构成隐藏 - 当子类中拥有与父类相同函数名的函数时,子类对象在调用该函数时,会首先去子类中查找实现方式,如果子类中有实现,则执行子类函数,如果子类函数没有实现,然后去调用父类函数。
重写(覆盖)
- 如果同名函数在不同的类中、参数相同、基类中的同名函数带有virtual关键字声明,这时基类中的同名函数将被重写(覆盖),它有以下两个特点:
①当对象调用子类中的同名函数时,表现和被隐藏时相同,程序结果不变(但其实和隐藏是不同的);
class A
{
public:
virtual void show(){
cout << "A--show()" << endl;
}
};
class B : public A
{
public:
void show(){
cout << "B--show()" << endl;
}
};
int main(){
A a;
B b;
a.show();
b.show();
system("pause");
return 0;
}
②当通过指针或引用调用子类中的同名函数时,由于需要区别指针(引用)的类型和指针(引用)所指对象的类型,此时的表现就和隐藏不同了——通过基类指针指向不同对象,指针会根据对象的类型不同,调用其相应的函数。
class A
{
public:
virtual void show(){
cout << "A--show()" << endl;
}
};
class B : public A
{
public:
void show(){
cout << "B--show()" << endl;
}
};
void fun(A* p){
p->show();
}
int main(){
A a;
B b;
fun(&a);
fun(&b);
system("pause");
return 0;
}
一个含有虚函数的类中都至少都有一个虚函数表指针,因为虚函数的地址要被放到虚函数表中, 虚函数表也简称虚表。
运行结果:
- CentOS7下Elasticsearch集群部署记录
- Flash/Flex学习笔记(27):摄像头/麦克风的视频/音量指示器
- Flash/Flex学习笔记(26):AS3自定义右键菜单
- Python27中Json对中文的处理
- Python在VSCode中进入交互界面调试
- CentOS7下单机部署RabbltMQ环境的操作记录
- Flash/Flex学习笔记(24):粒子效果
- 针对业务日志的监控报警设置
- 对广晟有色的数据分析
- Flash/Flex学习笔记(22):滤镜学习
- Python输出信息
- Flash/Flex学习笔记(21):利用colorTransform改变对象的颜色及透明度
- 网站访问状态和超时时间监控报警设置
- 为treeview添加客户端事件
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 让终端支持https,移植OpenSSL和libcurl到嵌入式linux,遇到的问题总结
- ComplexHeatmap|根据excel表绘制突变景观图(oncoplot)
- R-plotly|甘特图(Gantt chart)- 一不小心年中了,立个flag
- XXE漏洞那些事儿(JAVA)
- Hexo 建站过程
- Tidyverse|tidyr数据重塑之gather,spread(长数据宽数据转化)
- fastjson中的jndi注入
- R|生存分析-结果整理
- 实验吧-因缺思汀的绕过
- MySQL 用户与授权管理详解
- 基本知识|R语言简单饼图的绘制
- 分享一个有趣且牛逼的漏洞
- ggplot2-annotation|画图点“精”,让图自己“解释”
- 使用curl工具调试https接口
- 让android支持https访问银联后台,测试成功