【C++grammar】名字隐藏与重定义

目录

  • 1、继承中的名字隐藏
    • 1.基类同名函数被隐藏的现象描述
    • 2.问题理解
    • 3.避免现象
  • 2、重定义
    • 1.现象描述
    • 2.重定义与重载的区别
    • 3.能否使用 using 将基类成员引入到派生类定义中

1、继承中的名字隐藏

1.基类同名函数被隐藏的现象描述

在学习变量作用域的时候知道,全局变量可能被函数里面的同名局部变量所隐藏,如果要在函数里面使用这个同名全局变量,那么就要使用域解析运算符。

在继承中也会出现上述类似的情况,下面是名字隐藏的形式:

基类和派生类中都有一个同名函数,不同的是派生类的函数有个整型形参。

在主函数中调用f(),那么调用的到底是基类的函数还是派生类的函数?

class P{public:void f(){}
};class C :public P{public:void f(int x){}
};
int main()
{C c;c.f();
}

在这里插入图片描述
编译器会报错。

2.问题理解

我们可以将派生类看做是内部作用域,基类看做是外部作用域。内部作用域的函数f()将外部作用域的f()给隐藏掉了。

那么在C类中就看不到基类中的f()同名函数了。

这个做法可以帮助程序员避免写出带有危险性的代码。

3.避免现象

那么如何解决这个问题呢?
using 声明语句可以将基类成员引入到派生类定义中,显式声明。

class P{public:void f(){}
};class C :public P{public:using P::f;void f(int x){}
};
int main()
{C c;c.f();
}

其实还有两种写法:
1、

class P{public:void f(){}
};class C :public P{public:void f(int x){}
};
int main()
{C c;c.P::f();
}

2、

class P{public:void f(){}
};class C :public P{public:void f(int x){}
};
int main()
{C c;static_cast<P>(c).f();
}

2、重定义

1.现象描述

名字隐藏在重定义函数的时候有比较大的作用。因为有名字隐藏,所以我们可以在子类里面重新定义一个与基类里面名字参数一样的函数

之前定义了基类shape:
在这里插入图片描述
其中,toString函数用来描述对象的信息。基类可以调用这个函数,但是基类是无法输出派生类信息的。
例如形状就不能输出它的派生类:圆,的半径。只能输出颜色和是否填充。
我们可以在派生类里面重新定义toString函数用来描述派生类对象,这样就不会调用基类的toString函数了。

2.重定义与重载的区别

重载
多个函数名字相同,但至少以下一个特征不同:

1、参数类型(parameter type)

2、参数数量(parameter number)

3、参数顺序(parameter sequence)

重定义
1、函数特征相同:同名、同参数、返回值类型

2、在基类和派生类中都有定义

3.能否使用 using 将基类成员引入到派生类定义中

派生类B中的 foo()函数是对基类A中的 foo() 函数的重定义。
那么在类B中,能否使用 using 讲基类A中的foo()函数引入到派生类B中?为什么?

#include<iostream>#include<string>using namespace std; class A {public: string func() {        return "aaa";    }};class B :public A {public:using A::func; string func() {        return "bbb";    }}; int main() { A a; B b; cout<<a.func()<<endl;cout<<b.func()<<endl; }结果是:aaabbb编译运行正常通过,所以还是调用了 子类 的函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377743.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十四、聚类实战——图片压缩

对同一像素点值的像素点归为一类&#xff0c;通过平均值进行取代&#xff0c;从而将图像进行压缩并且保证图像尽可能不失真&#xff0c;关键信息仍保留。 from PIL import Image import numpy as np from sklearn.cluster import KMeans import matplotlib import matplotlib.…

步骤菜单使用css3实现

代码库&#xff1a;http://thecodeplayer.com/walkthrough/css3-breadcrumb-navigation 有兴趣的可以看一下&#xff0c;看完绝对让你大饱眼福。首先截图&#xff0c;看效果看着很酷吧&#xff0c;其实实现起来也不是很难&#xff0c;里边需要用的技术有:box-shadow,计数器&…

【嵌入式系统】STM32串口通信的四种方法(基于RTOS)

目录1、串行通信的基本参数2、轮询方式代码效果3、中断方式代码效果4、中断加上时间戳方式代码及效果5、DMA空闲中断方式接收数据1、串行通信的基本参数 串行端口的通信方式是将字节拆分成一个接一个的位再传输出去&#xff0c;接收方再将此一个一个的位组合成原来的字符&…

十五、聚类的评估

一、Given Label 均一性homogeneity&#xff1a;一个簇中只包含一个类别样本&#xff0c;Precision 完整性completeness&#xff1a;同类别样本被归到同一个簇中&#xff0c;Recall 将均一性h和完整性c进行结合(二者加权平均)得到V-Measure&#xff0c;&#xff0c;β为权重 …

SQL SERVER作业的Schedules浅析

SQL SERVER作业的计划&#xff08;Schedules&#xff09;&#xff0c;如果你没仔细研究过或没有应用一些复杂的计划&#xff08;Schedules&#xff09;&#xff0c;那么你觉得SQL SERVER作业的计划(Schedules)非常好用&#xff0c;也没啥问题&#xff0c;但是我要告诉你一个“残…

leetcode 51. N 皇后 思考分析

目录题目思考AC代码题目 n 皇后问题研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 思考 首先以N4为例&#xff0c;画出解空间树的一部分&#xff1a; 根据模板&#xff1a; void backtracking(参数) {if(终止条件){存放结果…

No module named ‘tensorflow.examples‘解决方案

想从tensorflow中导入mnist手写数字数据集&#xff0c;结果报错 from tensorflow.examples.tutorials.mnist import input_data import tensorflow.compat.v1 as tf tf.disable_v2_behavior()my_mnist input_data.read_data_sets("MNIST_data_bak/", one_hotTrue)&…

.NET通用基本权限系统

DEMO下载地址&#xff1a; http://download.csdn.net/detail/shecixiong/5372895 一、开发技术&#xff1a;B/S(.NET C# ) 1、Windows XP以上 (支援最新Win 8) 2、Microsoft Visual Studio 2010/2012 C#.NET 3、.NET Framework 4.0以上 (支援最新4.5版本) 4、SQL Server 2005以…

leetcode 37. 解数独 思考分析

目录题目核心思路的不断细化1、核心框架2、考虑到每个位置的工作3、考虑到到达最后一列、该位置的数已经预置的情况4、判断是否符合规则的函数5、确定递归终止条件确定函数返回值AC代码题目 编写一个程序&#xff0c;通过填充空格来解决数独问题。 一个数独的解法需遵循如下规…

快速完成兼职外包开发任务

做了很多年的开发相关的工作&#xff0c;做过兼职开发&#xff0c;也做过外包一些开发项目。 兼职人员角色时 正是经历这些事情时&#xff0c;每次就要提前很费经的跟公司沟通&#xff0c;让他们把公司内部的svn开发出去&#xff0c;但是就是很难&#xff0c;会涉及到安全各方的…

使用YOLOv5训练NEU-DET数据集

一、下载YOLOv5源码和NEU-DET(钢材表面缺陷)数据集 YOLOv5源码 NEU-DET(钢材表面缺陷)数据集 这里的数据集已经经过处理了&#xff0c;下载即可 若通过其他途径下载的原始数据集标签为xml格式&#xff0c;需要转化为txt格式XML转txt格式脚本 二、数据集准备 NEU-DET(钢材表…

带分页功能的SSH整合,DAO层经典封装

任何一个封装讲究的是&#xff0c;使用&#xff0c;多状态。Action&#xff1a;任何一个Action继承分页有关参数类PageManage&#xff0c;自然考虑的到分页效果&#xff0c;我们必须定义下几个分页的参数。并根据这个参数进行查值。然后在继承ServiceManage&#xff0c;Service…

leetcode 198. 打家劫舍 思考分析

目录1、题目2、求解思路3、代码1、题目 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动…

找不到Windows照片查看器解决方法

桌面创建一个txt文本 复制这些命令&#xff0c;之后将后缀改为.reg&#xff0c;右击管理员身份运行即可 Windows Registry Editor Version 5.00 ; Change Extensions File Type [HKEY_CURRENT_USER\Software\Classes\.jpg] "PhotoViewer.FileAssoc.Tiff" ; Change E…

伙伴分配器的一个极简实现

提起buddy system相信很多人不会陌生&#xff0c;它是一种经典的内存分配算法&#xff0c;大名鼎鼎的Linux底层的内存管理用的就是它。这里不探讨内核这么复杂实现&#xff0c;而仅仅是将该算法抽象提取出来&#xff0c;同时给出一份及其简洁的源码实现&#xff0c;以便定制扩展…

[USACO3.2.3 Spinning Wheels]

[关键字]&#xff1a;模拟 枚举 [题目大意]&#xff1a;有5个轮子&#xff0c;每个轮子优r个缺口并且会按一定速度不停转动&#xff0c;问什么时候可以使一条光线射过所有轮子。 // [分析]&#xff1a;从0到1000&#xff08;或其他的&#xff09;枚举分钟然后判断&#xff0c;当…

一、SQLServer2008安装(带密码)、创建数据库、C#窗体项目测试

一、下载和安装SQLServer2008 东西太大了&#xff0c;没法上传到资源里面&#xff0c;官网其他公众号都下载可以。 右击管理员身份 运行setup.exe 这个密钥不能用的话&#xff0c;也可以去百度其他密钥 JD8Y6-HQG69-P9H84-XDTPG-34MBB 建议改一下路径&#xff0c;我这边修…

【C++grammar】多态、联编、虚函数

目录1、多态概念1.多态性有两种表现的方式2、联编&#xff08;实现多态&#xff09;1.静态联编2.动态联编3、实现运行时多态1.为何要使用运行时多态&#xff1f;2.如何实现运行时多态3.多态的例子1.调用哪个同名虚函数&#xff1f;2. 用途&#xff1a;可以用父类指针访问子类对…

一 MVC - HtmlHelper

HtmlHelper类位于System.Web.Mvc.Html之中主要有七个静态类组成&#xff1a; FormExtensions - BeginForm, BeginRouteForm, EndForm InputExtensions - CheckBox, CheckBoxFor, Hidden, HiddenFor, Password, PasswordFor, RadioButton, RadioButtonFor, TextBox, TextBoxFor …

二、用户登录和注册

一、页面设计 一共四个页面 主页面Form1&#xff0c;登录页面login&#xff0c;注册页面resister&#xff0c;主菜单页面main_page 系统运行进入Form1&#xff0c;单击登录按钮跳转到login&#xff0c;数据库中得存在数据信息且输入正确才可登录成功&#xff0c;跳转到main_pa…