C++中名字隐藏,名字查找优先于类型检查

题目

C++中名字隐藏是什么?

解答

让我们通过一个例子来讲解C++中的名字隐藏。在C++中,如果一个类里有一个重载的方法, 你用另一个类去继承它并重写(覆盖)那个方法。你必须重写所有的重载方法, 否则未被重写的方法会因为名字相同而被隐藏,从而使它在派生类中不可见。

请看例子:

class FirstClass{
public:
    virtual void MethodA(int);
    virtual void MethodA(int, int);
};
void FirstClass::MethodA(int i){
    cout<<"ONE"<<endl;
}
void FirstClass::MethodA(int i, int j){
    cout<<"TWO"<<endl;
}

上面的类中有两个方法(重载的方法),如果你想在派生类中重写一个参数的函数, 你可以这么做:

class SecondClass : public FirstClass{
public:
    void MethodA(int);
};
void SecondClass::MethodA(int i){
    cout<<"THREE"<<endl;
}

int main (){
    SecondClass a;
    a.MethodA(1);
    a.MethodA(1, 1);
    return 0;
}

上面的main函数中,第2个MethodA在编译时会报错,提示没有与之匹配的函数。 这是因为两个参数的MethodA在派生类中是不可见的,这就是名字隐藏。

名字隐藏与虚函数无关。所以不管基类中那两个函数是不是虚函数, 在这里都会发生名字隐藏。解决方法有两个。第一个是将2个参数的MethodA换一个名字, 那么它在派生类中就可见了。但我们既然重载了MethodA,说明它们只是参数不同, 而实际上应该是在做相同或是相似的事的。所以换掉名字并不是个好办法。因此, 我们一般采用第二种方法,在派生类中重写所有的重载函数。

时间: 2024-10-25 09:00:45

C++中名字隐藏,名字查找优先于类型检查的相关文章

名字查找先于类型检查:函数重载与作用域

作用域屏蔽名字:内层作用域中声明的名字将隐藏外层作用域中声明的同名实体. 同名??C++有关同名的除了变量之外,也就是函数重载了!! [作用域对于函数重载的限制] 1. 在不同的作用域中无法重载函数名 2. 函数匹配时,编译器首先寻找对该函数名的声明,一旦在当前作用域中找到了所需的名字,编译器就会忽略掉外层作用域中的同名实体,剩下的工作就是检查函数调用是否有效了 #include <iostream> using namespace std; void print(double); void

批量取出文件夹中图片的名字存进文本,并去命名新的文件夹下的图片

这个任务为具体分为两步完成的: 1.取出文件中的图片的名字存入到文本中: 2.逐行取出文本中的名字去逐个命名新文件夹下的图片: 任务一: 1 # -*- coding:utf-8 -*- 2 import sys 3 sys.path.append('D:\tensorflow\install\libs') 4 import os #os:操作系统相关的信息模块 5 import random #导入随机函数 6 #存放原始图片地址 7 #data_base_dir = r"F:\underwa

LNMP中一些隐藏的安装脚本及目录详解

伏笔VPS一向在用军哥的LNMP一键script搭建站点,使用的人挺多的,而许多人只晓得script是部署Nginx.MySQL/MariaDB.PHP.phpMyAdmin等建站主要环境的,却不晓得该部署包的别的功能script,这里就说下隐蔽的别的软件script及部署目录. script 1.lnmp部署 #这里用的是最新测试版1.5 wget -c http://soft.vpser.net/lnmp/lnmp1.5beta.tar.gz && tar zxf lnmp1.5bet

关于在C#中对类中的隐藏基类方法和重写方法的理解

最近在学习C#,在C#中的类看到重写和隐藏基类的方法这些概念.才开始感觉自己不是很理解这些概念.也区分不开这些概念.通过自己的查找资料和练习后.慢慢的理解了类中的隐藏和重写这个概念.在C#中只有在基类定义了一些虚方法才能在派生类中重写基类中的虚方法.但是如果在派生类中使用隐藏方法,就不用在基类中定义虚方法.虚方法和重写实现的功能感觉是差不多的.都是在派生类中改变了基类中的方法,但是两者还是有质的区别,概念的性质也是不一样的.   重写是指:将基类中的方法替换掉,也就是抹掉基类中的原有方法,在派生

CAD编辑器中怎么隐藏图纸中标注的尺寸

在建筑设计师们编辑CAD图纸的时候,都会对每一张CAD图纸中的内容进行标注尺寸,但是在我们交给客户查看CAD图纸的时候,标注有尺寸的CAD图纸看起来不是那么的美观,那我们怎么隐藏CAD图纸中标注的尺寸呢?具体要怎么操作?下面小编就教教大家在迅捷CAD编辑器标准版中查看CAD图纸文件时,怎么隐藏图纸中标注的尺寸. 第一步:首先在电脑中任选一个浏览器,在浏览器中搜索迅捷CAD编辑器(标准版),进入官网点击下载最新版本的CAD编辑器,然后双击软件进入到软件的操作窗口. 第二步:编辑器打开之后,在软件顶

javascript中通过className灵活查找元素 例如我们要把根据class来进行修改样式

原文:javascript中通过className灵活查找元素 例如我们要把根据class来进行修改样式 一.背景:一个表单中,要修改一些li中有class=box的样式,将它的background设置为red红色.一般的做法是我们可以先找到父级元素 ,然后由父级元素找到所有相关tagName,最后,来一个if判断,如果class属性为box,则修改之 var oUl = document.getElementById("ul1");                          

Qt中indexOf()和lastIndexOf()查找字符串位置

首页 ? JavaScript ? indexOf()和lastIndexOf()查找字符串位置 indexOf()和lastIndexOf()查找字符串位置 发表于 2011-10-05 由 admin 有两个可以从字符串中查找子字符串的方法:indexOf()和lastIndexOf().这两个方法都是从一个字符串中搜索给定的字符串,然后返回子字符串的位置(如果没有子字符串的位置,则返回-1).这两种的方法的区别在于:indexOf()方法从字符串的开头向后搜索字符串,而lastIndexO

在PADS LAYOUT中如何隐藏不需要的鼠线?

如下图示,将net GPR_0的鼠线隐藏. 鼠标右键,选择网络----选择你要隐藏的网络------右键选择view nets----点击对话框右边View List里你所选的网络-----在右下角traces plus the....和None两个打勾,点Apply,就ok了. 在PADS LAYOUT中如何隐藏不需要的鼠线?,布布扣,bubuko.com

CSS圆角效果 -webkit-border-radius(CSS3中border-radius隐藏的威力)

CSS圆角效果 -webkit-border-radius(CSS3中border-radius隐藏的威力) 来源:互联网 作者:佚名 时间:03-28 14:17:14 [大 中 小] border-radius:用这个属性能实现圆角边框的效果.现在只有Mozilla/Firefox 和 Safari 3支持该属性. -webkit-border-radius:苹果:谷歌,等一些浏览器认,因为他们都用的是webkit内核: -moz-border-radius:moz这个属性 主要是专门支持M