重载、重写(覆盖)和隐藏的区别

一、重载

  重载从overload翻译过来,是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。

示例代码如下:

classA{
public:void test(int i);void test(double i);void test(int i, double j);void test(double i, int j);int test(int i); //错误,非重载
};

前四个互为重载函数,最后一个和第一个不是重载函数。

二、隐藏

  隐藏是指派生类的函数屏蔽了与其同名的基类函数。注意只要同名函数,不管参数列表是否相同,基类函数都会被隐藏。

实例代码如下:

#include<iostream>
using namespace std;classA{
public:void fun1(int i, int j){cout <<"A::fun1() : " << i <<" " << j << endl;}
};
classB : public A{
public://隐藏void fun1(double i){cout <<"B::fun1() : " << i << endl;}
};
int main(){B b;b.fun1(5);//调用B类中的函数b.fun1(1, 2);//出错,因为基类函数被隐藏system("pause");return 0;
}

三、重写

  重写翻译自override,也翻译成覆盖,是指派生类中存在重新定义的函数。其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一致。只有函数体不同(花括号内),派生类调用时会调用派生类的重写函数,不会调用被重写函数。重写的基类中被重写的函数必须有virtual修饰。

实例代码如下:

#include<iostream>
using namespace std;
class A{
public:virtual void fun3(int i){cout <<"A::fun3() : " << i << endl;}
};
class B : public A{
public:
//重写virtual void fun3(int i){cout <<"B::fun3() : " << i << endl;}
};
int main(){A a;B b;A * pa = &a;pa->fun3(3);pa = &b;pa->fun3(5);system("pause");return0;
}

上面为虚函数实现多态的代码,不明白的先看虚函数实现多态的原理。

四、区别

重载和重写的区别:

(1)范围区别:重写和被重写的函数在不同的类中,重载和被重载的函数在同一类中。

(2)参数区别:重写与被重写的函数参数列表一定相同,重载和被重载的函数参数列表一定不同。

(3)virtual的区别:重写的基类必须要有virtual修饰,重载函数和被重载函数可以被virtual修饰,也可以没有。

隐藏和重写,重载的区别:

(1)与重载范围不同:隐藏函数和被隐藏函数在不同类中。

(2)参数的区别:隐藏函数和被隐藏函数参数列表可以相同,也可以不同,但函数名一定同;当参数不同时,无论基类中的函数是否被virtual修饰,基类函数都是被隐藏,而不是被重写。

调试运行如下代码:

#include<iostream>
using namespace std;
class A{
public:void fun1(int i, int j){cout <<"A::fun1() : " << i <<" " << j << endl;}void fun2(int i){cout <<"A::fun2() : " << i << endl;}virtual void fun3(int i){cout <<"A::fun3(int) : " << i << endl;}
};
class B : public A{
public:
//隐藏void fun1(double i){cout <<"B::fun1() : " << i << endl;}
//重写void fun3(int i){cout <<"B::fun3(int) : " << i << endl;}
//隐藏void fun3(double i){cout <<"B::fun3(double) : " << i << endl;}
};int main(){B b;A * pa = &b;B * pb = &b;pa->fun3(3);//重写,多态性,调用B的函数b.fun3(10);//根据参数选择调用哪个函数,可能重写也可能隐藏,调用B的函数pb->fun3(20);//根据参数选择调用哪个函数,可能重写也可能隐藏,调用B的函数system("pause");return 0;
}

输出结果为:

B::fun3(int) : 3
B::fun3(int) : 10
B::fun3(int) : 20
请按任意键继续. . .

转载于:https://www.cnblogs.com/jeakeven/p/5310182.html

c++ -- 重载、重写(覆盖)和隐藏的区别相关推荐

  1. C++成员函数重载、覆盖和隐藏的区别

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

  2. C++中类成员函数的重载、覆盖和隐藏的区别,超清楚!

    转载:https://www.cnblogs.com/liubo1/p/5925746.html 1.成员函数被重载的特征: (1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: ...

  3. C++学习笔记-----继承体系中函数的重载,覆盖和隐藏的区别

    1.重载,在同一个作用域中定义的同名不同参的一些函数为重载. 2.隐藏,若在基类中定义了某一non_virtual函数,在派生类重存在同名函数(不需要参数列表相同),基类的该函数在派生类中是不可见的, ...

  4. c++成员函数的重载、覆盖、隐藏区别

    c++成员函数的重载.覆盖.隐藏区别 成员函数的重载.覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚概念,否则错误将防不胜防. 重载与覆盖 成员函数被重载的特征: (1)相同的范围 ...

  5. 【转】c++重载、覆盖、隐藏——理不清的区别

    原文网址:http://blog.sina.com.cn/s/blog_492d601f0100jqqm.html 再次把林锐博士的<高质量c++编程指南>翻出来看的时候,再一次的觉得这是 ...

  6. 《C++成员函数重载、覆盖与隐藏》

    <成员函数的重载.覆盖与隐藏> ------------------------------------------------------------------------------ ...

  7. C++中的重载、覆盖、隐藏对比

    1.重载.重写(覆盖).隐藏三者概念解释 重载(overload):同一个可访问区域内被声明的几个具有不同参数列(参数的类型.个数.顺序不同)的同名函数.根据参数列表,最终确定调用哪个函数,重载不关心 ...

  8. 【转】C++ 重载、覆盖和隐藏

    原文地址:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/24/2607173.html 1.重载 所谓函数重载是指同一个函数名可以对应着多个函数 ...

  9. 成员函数的重载、覆盖与隐藏(详细)【转】

    (转自:https://blog.csdn.net/weixin_42205987/article/details/81569744) 成员函数的重载.覆盖与隐藏 成员函数的重载(overload). ...

  10. java 覆盖和隐藏_Java方法的覆盖与隐藏的区别分析

    本篇文章介绍了,关于Java方法的覆盖与隐藏的区别分析.需要的朋友参考下 关于隐藏和覆盖的区别,要提到RTTI(run-time type identification)(运行期类型检查),也就是运行 ...

最新文章

  1. 三、Java基础工具(1)_常用类——随机数
  2. linux 路由跟踪表 nf_conntrack 数据结构 参数 简介
  3. mysql集群数据引擎_MySQL数据引擎
  4. Windows 下安装mysql
  5. 双时隙的工作原理_智能天线工作原理是什么 智能天线技术发展介绍【图文】...
  6. 适合python爬虫使用的浏览器_python爬虫:使用Selenium模拟浏览器
  7. 视频开发(即时通讯平台)
  8. [导入]Asp.Net小技巧集合
  9. 算法入门到进阶(一)——算法复杂度
  10. 设计模式(一)——统一建模语言基础知识
  11. 解决win10新建文本文档内容可以打开但显示图标不对的问题
  12. ipad显示portal服务器获取不,苹果portal认证失败原因合集
  13. 使用Jimi处理图像
  14. ArcGIS基础:面数据空洞填充的方法
  15. linux 目录 问号 原因,linux – 在目录的ls中显示的问号. IO错误也是如此
  16. DE-MerTOX™ 重金属排毒剂-道格拉斯实验室
  17. 当贝桌面服务器域名,【当贝市场】如何将当贝桌面替换为系统桌面
  18. IPv4, IPv6, IPv9能表示多少IP地址?
  19. 电脑端微信多开方法,亲测有效
  20. COMTRADE(IEEE标准电力系统暂态数据交换通用格式STD C37.111-1991/1999)文件格式解析...

热门文章

  1. java怎么这么难学6_Java难吗?
  2. python模块time_python模块之time和datetime
  3. mojolicious mysql_CentOS 下玩 Mojolicious 第一课
  4. 配置kubeconfig文件实现kubectl多集群切换
  5. mysql 命令行执行存储过程_mysql 命令行执行存储过程
  6. Linux开机自动启动Tomcat
  7. JUnit-4.12使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
  8. 无线信号拓展与覆盖的解决方案
  9. java流程控制结构不包括_以下各项中不属于Java语言流程控制结构的是()。
  10. 轻量化html编辑器,web端实现富文本编辑器