【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,一经查实,立即删除!

相关文章

javascript 核心概念(1)-数据类型

语法 &#xff08;1&#xff09;到现在为止&#xff0c;大多数浏览器也还是支持到ECMAScript 第三版的标准。 核心概念就是一个语言的基本工作原理&#xff0c;涉及语法&#xff0c;操作符&#xff0c;数据类型。 &#xff08;2&#xff09;javascript的一切--变量&#xff0c;…

注解的力量 -----Spring 2.5 JPA hibernate 使用方法的点滴整理(五):使用@Component 来简化bean的配置...

虽然我们可以通过 Autowired 在 Bean 类中使用自动注入功能&#xff0c;但是 Bean 还是在 applicatonContext.xml 文件中通过 <bean> 进行定义 —— 在前面的例子中&#xff0c;我们还是在配置文件中定义 Bean&#xff0c;通过 Autowired为 Bean 的成员变量、方法形参或构…

c语言条件语句示例_PHP中的条件语句和示例

c语言条件语句示例PHP条件语句 (PHP Conditional Statements) While coding, you may get to a point where your results can only be gotten when a condition is valid. We make use of conditional statements. Conditional statements are statements that can only be ex…

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

对同一像素点值的像素点归为一类&#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;接收方再将此一个一个的位组合成原来的字符&…

大数据 java 代码示例_Java变量类型与示例

大数据 java 代码示例Java变量 (Java variables) Variables are the user-defined names of the memory blocks, and their values can be changed at any time during program execution. They play an important role in a class/program as they help in to store, retrieve…

毕业设计

位置跟踪系统工作原理&#xff08;博闻网&#xff09; http://science.bowenwang.com.cn/location-tracking.htm Azuma是这样定义增强现实的 :虚实结合 ,实时交互 ,三维注册 环境搭建&#xff1a; http://cvchina.net/thread-173-1-1.html http://blog.csdn.net/jdh99/article/…

十五、聚类的评估

一、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(终止条件){存放结果…

Django实战(18):提交订单

前面的内容已经基本上涵盖了Django开发的主要方面&#xff0c;我们从需求和界面设计出发&#xff0c;创建模型和修改模型&#xff0c;并通过scaffold作为开发的起点&#xff1b;在scaffold的基础上重新定制模板&#xff0c;并且通过Model类和Form类对用户输入的数据进行校验。我…

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)&…

julia example_使用Julia中的Example的sign()函数

julia exampleJulia| sign()函数 (Julia | sign() function) sign() function is a library function in Julia programming language, it returns the sign of the given value in the form of -1/1. sign()函数是Julia编程语言中的库函数&#xff0c;它以-1 / 1的形式返回给…

.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(钢材表…

kotlin获取属性_Kotlin程序获取系统MAC地址

kotlin获取属性The task is to get system MAC address. 任务是获取系统MAC地址。 package com.includehelpimport java.net.InetAddressimport java.net.NetworkInterface//Function to get System MACfun getSystemMac(): String? {return try {val OSName System.getProp…

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

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