首先一个简单的样例:

int x;
int f()
{
double x;
cin >> x;
return x;
}

在上述代码中。函数f的局部变量x掩盖了全局变量x。这得从 “C++的名字查找机制“说起,首先。在函数f的局部作用域中查找。(甚至是语句块)。假设不存在,到上一层的作用域再进行查找,... 该命名空间中查找,最后是全局作用域。

在类的继承体系中,名字覆盖问题也是非常困扰的。此处的"名字"但是是函数名,变量名,typedef, enum都能够,此处以函数名为例。

值得注意的是,Derived的作用域是嵌套在Base作用域中的。

对于以下的代码:

class Base
{
public:
//对于C++类中定义的不论什么类型的函数,名字覆盖的规则都是一样的。
virtual void func1(int x){cout << "func1(int) in Base ..." << endl;}
void func2(){cout << "func2() in Base ..." << endl;}
virtual void func3() = 0;
}; class Derived : public Base
{
public:
void func1() {cout << "func1() in Derived..." << endl;}
void func2(int x) {cout << "func2(int) in Derived..." << endl;}
void func3() {cout << "func3() in Derived..." << endl;}
void func3(int ) {cout << "func3() in Derived..." << endl;}
}; int main()
{
Derived d;
d.func1(3); //调用失败。 编译器在Derived的作用域中找到了该函数名字,可是发现调用不匹配,不能通过编译
d.func2();
return 0;
}

Base基类中定义了函数func1 与 func2,在派生类中重写了函数func1,并定义了该函数的重载版本号。

对于main函数内的调用,见凝视解析。

编译器在面对函数调用时,首先是在作用域范围内查找该函数名(由内之外)。 假设找到了该函数名之后。编译器便停止查找,開始检查形參与实參的匹配是否合法, 假设不合法,不能通过编译。

假设要在上述代码中调用 基类中的版本号 func1(int),那么就须要让编译器在看到该函数调用时,第一时间看到base中的该函数名字,因此。using声明攻克了这个难题,在Derived类定义体内部使用using base::func1声明,也就是让Base中的func1函数名字在  ”编译器查找Derived“作用域是可见 。

using的位置放在哪里???。!!

非常easy的道理,public继承 意味 ”  is   a   “的关系,那么在Base class中的 public的名称在Derived中也应该是public。

可是,假设你并不想继承 Base中的全部的函数,仅仅想继承一部分,那么   这就无关于函数名字的问题了。 既然如此。public继承就不应该被使用!

因此,我会告诉你。使用private继承也许有这种福利。

如果Derived以private形式继承Base。而Derived中仅仅想要继承Base中的某个特定的函数版本号,那么using已经无论用了,你须要的是其它的技术。

比如以下的简单样例:

class Base
{
public:
void func1(){cout << "func1 in Base" << endl;}
};
class Derived : public Base
{
public:
void func1()
{
Base::func1(); //转交函数,相当于将func1 in Base 转交给func1 in Derived
}
};

最后。在C++的名字查找中。为了避免Base的函数名覆盖,使用using 声明或者转交函数来完毕。

C++ 继承体系中的名称覆盖的更多相关文章

  1. 关于Java继承体系中this的表示关系

    Java的继承体系中,因为有重写的概念,所以说this在子父类之间的调用到底是谁的方法,或者成员属性,的问题是一个值得思考的问题; 先说结论:如果在测试类中调用的是子父类同名的成员属性,这个this. ...

  2. C++继承体系中的内存对齐

    本篇随笔讨论一个比较冷门的知识,继承结构中内存对齐的问题,如今内存越来越大也越来越便宜,大部分人都已经不再关注内存对齐的问题了.但是作为一个有追求的技术人员,实现功能永远都是最基本的要求,把代码优化到 ...

  3. Java继承体系中this的表示关系

    在继承关系下,父类中的this关键字并不总是表示父类中的变量和方法.this关键字的四种用法如前文所述,列举如下. 1) this(paras…); 访问其他的构造方法 2) this.xxx; 访问 ...

  4. C++继承体系中的内存分段

    ---------------综述与目录-------------- 讨论这个问题之前我们先明确类的结构,一个类的大概组成,下面的很多分类名词都是我个人杜撰,为的就是让读者看懂能够区分,下面分别分类: ...

  5. 从基层容器类看万变不离其宗的JAVA继承体系

    以容器类为例子,可以观一叶而知秋,看看以前的前辈们是如何处理各种面向对象思想下的继承体系的.读的源代码越多,就越要总结这个继承关系否则读的多也忘得快. 首先摆上一张图片: 看到这张图很多人就慌了,难道 ...

  6. 使用RTTI为继承体系编写”==”运算符

    转载请注明出处:http://www.cnblogs.com/inevermore/p/4012079.html   RTTI,指的是运行时类型识别技术.   先看一个貌似无关的问题:   为继承体系 ...

  7. C++对象模型——继承体系下的对象构造(第五章)

    5.2 继承体系下的对象构造 当定义一个object例如以下: T object; 时,实际上会发生什么事情呢?假设T有一个constructor(不论是由user提供或是由编译器合成),它会被调用. ...

  8. WCF技术剖析之二十: 服务在WCF体系中是如何被描述的?

    原文:WCF技术剖析之二十: 服务在WCF体系中是如何被描述的? 任何一个程序都需要运行于一个确定的进程中,进程是一个容器,其中包含程序实例运行所需的资源.同理,一个WCF服务的监听与执行同样需要通过 ...

  9. Entity Framework 6 Recipes 2nd Edition(10-6)译 -> TPT继承模型中使用存储过程

    10-6. TPT继承模型中使用存储过程 问题 想在一个TPT继承模型中使用存储过程 解决方案 假设已有如Figure 10-6所示模型. 在模型里, Magazine(杂志) and DVD继承于基 ...

随机推荐

  1. 使用jstl方式替换服务器请求地址

    <c:set var="ctx" value="${pageContext.request.contextPath}"></c:set>

  2. ajax最基础入门

    1.介绍 AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重 ...

  3. maven-replacer-plugin 静态资源版本号解决方案(css/js等)

    本文介绍如何使用 maven 的 com.google.code.maven-replacer-plugin 插件来自动添加版本号,防止浏览器缓存. 目录 1.解决方案 2.原始文件和最终生成效果 3 ...

  4. 《深入分析JavaWeb技术内幕》学习笔记

    第一章 深入Web请求过程 1.1 B/S网站架构概述 HTTP协议采用无状态的短连接的通信方式.通常一次请求就完成一次数据交互,通常也对应一个业务逻辑. 当在浏览器里输入一个URL,首先会请求DNS ...

  5. date命令使用文档

    date命令的帮助信息 [root@localhost source]# date --help用法:date [选项]... [+格式] 或:date [-u|--utc|--universal] ...

  6. 【翻译】What is State Machine Diagram(什么是状态机图)?

    [翻译]What is State Machine Diagram(什么是状态机图)? 写在前面 在上一篇学习类图的时候将这个网站上的类图的一篇文章翻译了出来,感觉受益良多,今天来学习UML状态机图, ...

  7. 如何对vue项目进行优化,加快首页加载速度

    上个月上线了一个vue小项目,刚做完项目,打包上线之后,传到服务器上发现首页加载巨慢. 由于开发时间比较紧,我想着怎么快怎么来,因而在开发过程中没考虑过优化性能问题,酿成最后在带宽5M的情况下页面加载 ...

  8. codevs 1086 栈 2003年NOIP全国联赛普及组

    题目描述 Description 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈). ...

  9. FHQ Treap及其可持久化与朝鲜树式重构

    FHQ Treap,又称无旋treap,一种不基于旋转机制的平衡树,可支持所有有旋treap.splay等能支持的操作(只有在LCT中会比splay复杂度多一个log).最重要的是,它是OI中唯一一种 ...

  10. NOIP练习赛题目2

    小K的农场 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个 ...