3.4 C++名字隐藏
参数:http://www.weixueyuan.net/view/6361.html
总结:
如果派生类中新增一个成员变量,该成员变量与基类中的成员变量同名,则新增的成员变量就会遮蔽从基类中继承过来的成员变量。同理,如果派生类中新增的成员函数与基类中的成员函数同名,则该新增的成员函数就会遮蔽从基类中继承过来的成员函数。
被遮蔽了的基类的成员变量或成员函数并非是没有继承过来,而仅仅是被派生类的同名成员变量和成员函数给遮蔽了,调用的时候需要用到类名加上域解析操作符。
------------------
如果派生类中新增一个成员变量,该成员变量与基类中的成员变量同名,则新增的成员变量就会遮蔽从基类中继承过来的成员变量。同理,如果派生类中新增的成员函数与基类中的成员函数同名,则该新增的成员函数就会遮蔽从基类中继承过来的成员函数。
例1:
#include<iostream>
using namespace std; class basic
{
public:
void setx(int a){x = a;}
void sety(int b){y = b;}
int getx(){return x;}
int gety(){return y;}
private:
int x;
int y;
}; class derived : public basic
{
public:
void setx(char *a){x = a;}
char* getx(){return x;}
private:
char * x;
}; int main()
{
derived d1;
d1.setx("class"); //OK
d1.setx(); //compile error
d1.basic::setx(); //OK
return ;
}
在本例中定义了一个基类basic,之后通过继承basic类派生出derived类。需要注意的是在basic类中定义了一个成员变量x,该变量是int型,与之对应的成员函数是setx和getx函数。而派生类中同样定义了一个成员变量x,而它是char指针类型,与之对应的成员函数是setx和getx函数。在主函数中,定义了derived类的对象d1,我们在调用setx(char *)函数时,没有问题。接着又调用从基类中继承过来的setx(int)函数,结果编译出错。最后通过类名来调用基类继承过来的setx(int)函数,编译通过。在派生类derived中,setx(char *)与基类继承过来的setx(int)函数同名,如此一来,派生类新增的函数setx(char *)遮蔽了从基类继承而来的setx(int)函数,如此一来通过d1.setx(50)调用setx(int)是不成功的,故而出现编译错误,正确的调用方法是通过类名来调用:d1.basic::setx(int)。
从上例中,我们可以看出被遮蔽了的基类的成员变量或成员函数并非是没有继承过来,而仅仅是被派生类的同名成员变量和成员函数给遮蔽了,调用的时候需要用到类名加上域解析操作符。
3.4 C++名字隐藏的更多相关文章
- C++中名字隐藏,名字查找优先于类型检查
题目 C++中名字隐藏是什么? 解答 让我们通过一个例子来讲解C++中的名字隐藏.在C++中,如果一个类里有一个重载的方法, 你用另一个类去继承它并重写(覆盖)那个方法.你必须重写所有的重载方法, 否 ...
- Python中的名字隐藏
Python对于module文件中的name是没有private和public区分的,严格来说,在module文件重定义的任何name,都可以被外界访问.但是,对于 from module imort ...
- effective C++ Item 33 避免隐藏继承而来的名字
1. 普通作用域中的隐藏 名字实际上和继承没有关系.有关系的是作用域.我们都知道像下面的代码: int x; // global variable void someFunc() { double x ...
- 读书笔记 effective C++ Item 33 避免隐藏继承而来的名字
1. 普通作用域中的隐藏 名字实际上和继承没有关系.有关系的是作用域.我们都知道像下面的代码: int x; // global variable void someFunc() { double x ...
- C++ 名字重载、隐藏、覆盖
名字重载Name overloading 如果顶层函数有不同的签名,则函数名可以相同. 如果同一类中的函数有不同的签名,则函数名可以相同. C++中允许在相同的作用域内以相同的名字定义几个不同实现 ...
- C++进阶--Koenig lookup 依赖于实参的名字查找
//############################################################################ /* * Koenig Lookup / ...
- 原创 C++作用域 (一)
1概述 在所有的计算机程序中,一个基本的目标是操作一些数据,然后获得一些结果.为了操作这些数据,需要为这些数据分配一段内存,我们可以将这段内存称为变量.为了方便操作,以及程序可读性方面的考虑,需要使用 ...
- 多态(RAW)
函数重写overwrite:当子类提供了和父类同名的虚函数时,称之为函数重写,函数的返回值类 函数名 参数列表必须完全相同 名字隐藏namehide:当子类提供了和父类同名的数据时 叫名字隐藏 函数重 ...
- 《C++编程规范:101条规则、准则与最佳实践》学习笔记
转载:http://dsqiu.iteye.com/blog/1688217 组织和策略问题 0. 不要为小事斤斤计较.(或者说是:知道什么东西不需要标准化) 无需在多个项目或者整个公司范围内强制实施 ...
随机推荐
- xpath是什么(入门教程)
xpath是什么(入门教程) 一.总结 一句话总结:一句话,XPath 是一门在 XML 文档中查找信息的语言.简单来说,html类似于xml结构,但是没有xml格式那么严格. 在xml中查找信息 包 ...
- 一次dropzone体验
对于前端,本人不是太擅长,对于当前的一些网上的样例,也许是习武悟性太差,不是太透,所以只能通过blog的方式记录下一些武功套路,便于以后查询使用 首先,我们需要知道这个武功适应的战场. 什么是drop ...
- ubuntu16.04+cuda8.0+gpu
安装完ubuntu系统之后,在学校的环境下,联网需要安装mentohust. 参考: http://www.cnblogs.com/alexanderkun/p/6905604.html http:/ ...
- kernel_thread简析
1.3.100static inline pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags){ lon ...
- vue, vux调用微信点击图片,上传图片,删除图片,接口,其中选图接口,苹果手机显示有问题,查看不到图片,提交会提示fail not exist,解决如下
<template> <div v-cloak v-show="show"> <div v-show="mailbox"> ...
- php 递归删除文件夹
/*** 递归删除文件方法一 param $path 文件路径 **/ function delAll($path){ $path=str_replace('\\','/',$path);//去除反斜 ...
- 诡异的楼梯 HDU - 1180
Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向, ...
- Leetcode 970. 强整数
970. 强整数 显示英文描述 我的提交返回竞赛 用户通过次数223 用户尝试次数258 通过次数231 提交次数801 题目难度Easy 给定两个正整数 x 和 y,如果某一整数等于 x^i ...
- laravel请求到响应的生命周期
请求到响应的核个执行过程,主要可以归纳为四个阶段,即程序启动准备阶段.请求实例化阶段.请求处理阶段.响应发送和程序终止阶段. public\index.php中有这么一段代码 $app = requi ...
- 通过DBMS_REDEFINITION包对表在线重定义
基础介绍 Oracle Online Redefinition可以保证在数据表进行DDL类型操作,如插入.删除数据列,分区处理的时候,还能够支持DML操作,特别是insert/update/delet ...