当前位置: 首页 > 编程日记 > 正文

c++ 的重载、覆盖、隐藏

 

成员函数被重载的特征:
1)相同的范围(在同一个类中);
2)函数名字相同;
3)参数不同;
4virtual关键字可有可无。
覆盖是指派生类函数覆盖基类函数,特征是:
1)不同的范围(分别位于派生类与基类);
2)函数名字相同;
3)参数相同;
4)基类函数必须有virtual关键字。

隐藏是指派生类的函数屏蔽了与其同名的基类函数,
规则如下:
1)如果派生类的函数与基类的函数同名,但是参数不同此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。(这里与覆盖唯一区别是在于有没有virtual) 此时,基类的函数被隐藏(注意别与覆盖混淆)。

如下示例程序中:
1)函数Derived::f(float)覆盖了Base::f(float)
2)函数Derived::g(int)隐藏了Base::g(float),而不是重载。
3)函数Derived::h(float)隐藏了Base::h(float),而不是覆盖。

#include<iostream.h>class Base{
public:
virtual void f(floatx){cout<<"Base::f(float)"<<x<<endl;}void g(floatx){cout<<"Base::g(float)"<<x<<endl;void h(floatx){cout<<"Base::h(float)"<<x<<endl;}
};class Derived:publicBase{
public:
virtual void f(floatx){cout<<"Derived::f(float)"<<x<<endl;}void g(intx){cout<<"Derived::g(int)"<<x<<endl;}void h(floatx){cout<<"Derived::h(float)"<<x<<endl;}
};
void main(void){Derived d;Base *pb=&d;Derived *pd=&d;//Good:behavior depends solely on type of the object pb->f(3.14f);     //Derived::f(float)3.14apd->f(3.14f);     //Derived::f(float)3.14//Bad:behavior depends on type of the pointerpb->g(3.14f);     //Base::g(float)3.14pd->g(3.14f);     //Derived::g(int)3(surprise!)//Bad:behavior depends on type of the pointerpb->h(3.14f);     //Base::h(float)3.14(surprise!)pd->h(3.14f);     //Derived::h(float)3.14

小结:

(1) 重载 overload 是根据函数的参数列表来选择要调用的函数版本,而多态是根据运行时对象的实际类型来选择要调用的虚函数版本,多态的实现是通过派生类对基类的虚函数进行覆盖(override) 来实现的,若派生类没有对基类的虚函数进行覆盖 override 的话,则派生类会自动继承基类的虚函数版本,此时无论基类指针指向的对象是基类型还是派生类型,都会调用基类版本的虚函数;如果派生类对基类的虚函数进行覆盖 override 的话,则会在运行时根据对象的实际类型来选择要调用的虚函数版本,例如基类指针指向的对象类型为派生类型,则会调用派生类的虚函数版本,从而实现多态。这可以说是多态与覆盖之间的的关系了。

(2)使用多态的本意是要我们在基类中声明函数为 virtual ,并且是要在派生类中覆盖 override 基类的虚函数版本,注意,此时的函数原型与基类保持一致,即同名同参数类型;如果你在派生类中新添加函数版本,你不能通过基类指针动态调用派生类的新的函数版本,这个新的函数版本只作为派生类的一个重载版本。重载只有在当前类中有效。 

(3)重载是静态联编的,多态是动态联编的。进一步解释,重载与指针实际指向的对象类型无关,多态与指针实际指向的对象类型相关。若基类的指针调用派生类的重载版本, C++ 编绎认为是非法的, C++ 编绎器只认为基类指针只能调用基类的重载版本,重载只在当前类的名字空间作用域内有效,继承会失去重载的特性,当然,若此时的基类指针调用的是一个虚函数,那么它还会进行动态选择基类的虚函数版本还是派生类的虚函数版本来进行具体的操作,这是通过基类指针实际指向的对象类型来做决定的,所以说重载与指针实际指向的对象类型无关,多态与指针实际指向的对象类型相关。  

(4)虚函数同样可以进行重载,但是重载只能是在当前自己名字空间作用域内有效。

 

 

转载于:https://www.cnblogs.com/fangshenghui/archive/2012/06/04/2534596.html

相关文章:

【css】padding 和 margin的区别

css中有有一对经常是一起出现的属性&#xff1a;padding和margin&#xff0c;接下来我们以一个例子来看一下两个属性的作用及其区别。 实例演示&#xff1a; 使用属性前&#xff1a; 代码实现&#xff1a; <!DOCTYPE html> <html lang"en"> <head&…

POJ-2159(Water)

2159:Ancient Cipher 查看提交统计提问时间限制: 1000ms 内存限制: 65536kB 描述 Ancient Roman empire had a strong government system with various departments, including a secret service department. Important documents were sent between provinces and the capital…

tensor乘运算

torch.mul(a, b) 是矩阵 对应位相乘&#xff0c;即点乘操作&#xff0c; a和b的维度必须相等&#xff0c;a的维度是(1,2)&#xff0c; 则b的维度必须是&#xff08;1,2&#xff09;&#xff0c; 返回还是&#xff08;1,2&#xff09;的矩阵 torch.mm(a,b)是矩阵a和b矩阵相乘&am…

android,与PHP通信,返回JSON

小项目需要读取数据库&#xff0c;刚好手头有服务器&#xff0c;处于某些考虑&#xff0c;还是想远程读数据&#xff0c;所遇异常 Logcat异常&#xff1a;SingleClientConnManager(411): Invalid use of SingleClientConnManager: connection still allocated. Make sure to re…

【工具软件】webstorm配置

下载webstorm和jar包&#xff1a; 下载网址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Tnp4TqWnu8dQzv6ds7zhyw 提取码&#xff1a;de0f 下载软件&#xff1a; 1、 2、选择一个非C盘的位置安装 3、在1处选自你电脑的操作系统&#xff0c;大概率是64位的&#x…

美国爱因斯坦计划技术分析

【本文与2014年6月16日再次编辑&#xff0c;增加了一个续文的链接】【本文于2011年8月30日再次更新&#xff0c;修订并补充了有关爱因斯坦3的一些内容】【本文于2011年8月20日更新】【前言】本文始于对网络安全态势感知的研究。而美国的这个爱因斯坦计划可以看成是网络态势感知…

[C].运算符

运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言内置了丰富的运算符&#xff0c;并提供了以下类型的运算符&#xff1a; 算术运算符关系运算符逻辑运算符位运算符赋值运算符杂项运算符本章将逐一介绍算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和…

[kuangbin带你飞]专题六 最小生成树 L - 还是畅通工程 (简单最小生成树)

L - 还是畅通工程 题目链接&#xff1a;https://vjudge.net/contest/66965#problem/L 题目&#xff1a; 某省调查乡村交通状况&#xff0c;得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通&#xff08;但不一定有直…

[建议] GCC 新手入门【转】

本文是写给 gcc 新手的入门文章&#xff0c;所以内容比较简单。如果你知道下面3条命令都可以编译c的话&#xff0c;就不用在本文浪费时间了 g -Wall hellocpp.cpp gcc -Wall hellocpp.cpp -lstdc gfortran -Wall hellocpp.cpp -lstdc 注&#xff1a;本文最新版在wiki中 http:…

【java】如何判断数组中的内容是否重复

代码实现&#xff1a; public static boolean judgeArray(long[] arraySample) {HashSet<Long> hashSet new HashSet<Long>();for (int i 0; i < arraySample.length; i) {hashSet.add(arraySample[i]);}if (hashSet.size() arraySample.length) {return tr…

html标签的赋值与取值

现在有一个Add.ascx 和一个Add.aspx页面&#xff0c;Add.ascx中有一个html标签&#xff0c;如果标签有默认值的话在Add.ascx.cs的Page_Load中有Request.Form["标签ID"]就可以取到。 下面说赋值&#xff0c;因为我的标签是有默认值的&#xff0c;所以也就不能用<%%…

Entity Framework应用:根据实体的EntityState状态实现增删改查

在上一篇文章中&#xff0c;我们讲解了使用EF实现简单的增删改成&#xff0c;在这篇文章中我们使用实体的EntityState状态来优化数据的增删改查。 一、修改数据 上篇文章中的修改数据的方法是EF官方推荐的方式&#xff0c;即先查询出来要修改的数据&#xff0c;然后在修改。但是…

几种Normalization算法.md

神经网络有各种归一化算法&#xff0c;BN&#xff0c;LN&#xff0c;IN,GN。 1. Batch Normalization 实现流程&#xff1a;对Tensor为[N, C, H, W], 把第1个样本的第1个通道&#xff0c;加上第2个样本的第1个通道&#xff0c; 加上第N个样本的第1个通道&#xff0c;求平均&…

【java】浅谈注释

java中的注释可以分为三大类&#xff1a;行注释、块注释以及文档注释 行注释&#xff1a; 基本语法&#xff1a; //注释的内容 产生 效果&#xff1a;该行//之后的内容就都被注释了 块注释&#xff1a; 基本语法&#xff1a; /* 注释内容 */ 注&#xff1a;块注释禁止嵌套…

一个“复制/删除”方式的滚动

一个利用复制和删除节点的方式做的滚动。。。不知性能怎样呢&#xff1f; 一个滚动Left Right 12345678转载于:https://www.cnblogs.com/lbsgood/archive/2012/06/08/2541177.html

OSPF-网络类型(ip ospf network ?)

在介绍之前首先看个表&#xff01;二层链路与OSPF网络类型有什么联系呢&#xff1f;其实中间的关系可大了&#xff0c;OSPF网络类型应该说是根据二层链路的类型来选择的&#xff0c;而且两者应用匹配&#xff0c;也就是当OSPF网络类型支持组播时&#xff0c;如果二层链路不支持…

E20180525-hm

sensitive adj. 敏感的; 感觉的; [仪] 灵敏的; 易受影响的; lookup v. 查找; 查表; speedy adj. 快的&#xff0c;迅速的; 敏捷的 marshal vt. 整理&#xff0c;排列&#xff0c;集结; vi. 排列; 编队; n. 元帅; 典礼官; 执法官; 消防局长; feature n. 特征&#xff0c;特点;…

[题解]RGB Substring (hard version)-前缀和(codeforces 1196D2)

题目链接&#xff1a;https://codeforces.com/problemset/problem/1196/D2 题意&#xff1a; q 个询问&#xff0c;每个查询将给你一个由 n 个字符组成的字符串s&#xff0c;每个字符都是 “R”、“G” 或 “B”。 求出更改初始字符串 s 中的最小字符数&#xff0c;以便更改后将…

C#连接MySql

1.从http://prdownloads.sourceforge.net/mysqldrivercs/MySQLDriverCS-n-EasyQueryTools-3.0.18.exe?download上下载MySQLDriverCS. 然后安装。2.从安装目录中把MySQLDriverCS.dll.添加到.net的组件 1 public void Connect_Net()2 {3 MySQLConnection m…

【java】快速复制数组方法arraycopy的使用

通常进行数组的复制需要使用到循环&#xff0c;然而jdk中已经给我们封装好了一个专门用来复制数组的快捷方法 arraycopy&#xff08;&#xff09; 使用方法&#xff1a; System.arraycopy(src, srcPos, dest, destPos, length); 注&#xff1a; src:被复制的数组 srcPos&am…

【指针的高级声明】

在分享这些高级声明之前&#xff0c;我想&#xff0c;大家有必要知道各个操作符在C、C语言中的优先级&#xff0c;以便识别欲讲述的高级声明。这里先列举一些高级声明的例子&#xff0c;能自己揣摩清楚最好不过了&#xff0c;如果有想不懂的地方&#xff0c;请参见下方的识别方…

【大数据实时计算框架】Storm框架

一、大数据实时计算框架 1、什么是实时计算&#xff1f;流式计算&#xff1f; &#xff08;一&#xff09;什么是Storm?Storm为分布式实时计算提供了一组通用原语&#xff0c;可被用于“流处理”之中&#xff0c;实时处理消息并更新数据库。这是管理队列及工作者集群的另一种方…

引用-ZIGBEE-ZSTACK网络配置相关问题

下面是以道友问的问题&#xff0c;这里简单做分析&#xff0c;仅供交流学习用&#xff0c;有什么不对之处还请各位大虾指正。鄙人邮箱为&#xff1a;peterpanjy163.com. 欢迎交流&#xff01;&#xff01;1&#xff1a; 最主要的就是路由问题。我用06协议栈自带的例子程序sampl…

GHOST还原教程详细

要提醒您注意的是在使用 GHSOT 软件恢复系统时&#xff0c;请勿中途中止&#xff01;如果您在恢复过程中重新启动了计算机那么您的计算机将无法启动&#xff01;必定要接双硬盘或用光盘系统启动才可恢复 在您的系统遇到以下的情况之一 怀疑或确定您的系统中了病毒或木马 系统运…

【java】增强for循环的简单使用(遍历数组)

public class Test4 {public static void main(String[] args) {int[] intArray {1, 2, 4, 5, 7, 8};for(int number : intArray) {System.out.println(number);}} }

字符设备驱动程序 2

三、字符设备的注册内核内部使用struct cdev结构来表示字符设备。在内核调用设备的操作之前&#xff0c;必须分配并注册一个或多个struct cdev。代码应包含<linux/cdev.h>&#xff0c;它定义了struct cdev以及与其相关的一些辅助函数。 注册一个独立的cdev设备的基本过程…

qmake 简易教程

qmake 简易教程 qmake是Qt开发中默认的构建工具。posted on 2018-05-27 00:09 JichengTang 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/tangjicheng/p/9094857.html

MSF连环攻击实验

MSF连续攻击实验 一、实验拓扑 二、实验环境 Windows XP BT 5 32位 三、实验原理 通过扫描 XP主机&#xff0c;利用扫描出的漏洞建立 TCP会话&#xff0c;通过进程的提权&#xff0c;进一步获取目标机的控制权限 四、实验目的 掌握MSF连续攻击的原理和利用MSF攻击检测技术进行服…

【java】关于面向对象优点的个人理解

本文只是一些个人的理解&#xff0c;没有过多的进行基础理论的堆积&#xff0c;尽量说人话&#xff0c;让不懂的人也可以有一点概念。 相同的目标&#xff1a; 去第一餐厅吃饭 面向过程&#xff1a; 进入第一餐厅、买饭、吃饭 面向对象&#xff1a; 创建对象 第一餐厅、同…

(转)flash的Socket通讯沙箱和安全策略问题

一、沙箱和安全策略问题 1、此问题发生在连接时&#xff0c;准确地说是连接前&#xff0c;分别两种情况&#xff1a; 1.本地播放 本地播放时&#xff0c;默认情况下Flash Player将不允许swf访问任何网络。 访问http://www.macromedia.com/suppor…