Effective C++ Item 33 Avoid hiding inherited names
class Base {
private:
int x;
public:
virtual void mf1() = ;
virtual void mf2();
void mf3();
...
}; class Derived: public Base {
public:
virtual void mf1();
void mf4();
...
};
上面代码构成了一个 namespace
在 derived class 内的 mf4 代码实现为
void Derived::mf4() {
...
mf2();
...
}
编译器看到 mf2 后现在 mf4 的作用空间查找, 然后到 Derived 的作用空间查找, 最后在 Base 中找到.
2. 我们再考虑前一个例子, 这次让我们重载 mf1 和 mf3
class Base {
private:
int x;
public:
virtual void mf1() = ;
virtual void mf1(int);
virtual void mf2();
void mf3();
void mf3(double);
...
}; class Derived: public Base {
public:
virtual void mf1();
void mf3();
void mf4();
...
};
从名称查找观点来看, Base::mf1 Base::mf3 不再被 Derived 继承, 因为 Base class 内的函数被遮蔽了
Derived d;
int x;
..
d.mf1();
d.mf1(x); // 错误! Derived::mf1 遮蔽了 Base::mf1
d.mf2();
d.mf3();
d.mf3(x); // 错误! Derived::mf3 遮蔽了 Base::mf3
为了达成本来需要的目的, 我们只需在 Derived class 内添加两行代码
using Base::mf1;
using Base::mf3;
现在, 上面发生错误的代码都不会报错了, 一切按照既定的轨道在前进!
3. 但有时候, 你并不像继承 Base class 的所有函数, 这时可以理解的. 这在 public inheritance 中不可发生(见 item 32) 但 private inheritance 却是有可能的, 那么部分继承的一个很好的解决方案是 转交函数
class Derived: private Base {
public:
virtual void mf1() { // 转交函数
Base::mf1();
...
}
};
Effective C++ Item 33 Avoid hiding inherited names的更多相关文章
- 条款33:避免遮掩继承而来的名称(Avoiding hiding inherited names)
NOTE: 1.derived classes 内的名称会遮掩base classes内的名称.在public继承下从来没有人希望如此. 2.为了让被遮掩的名称再见天日,可使用using 声明方式或转 ...
- 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 ...
- Effective C++ Item 33 避免遮掩继承过来的名称
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie ? 不懂 c++为什么derived classes 内的名称要遮掩 base classe ...
- Effective JavaScript Item 33 让构造函数不再依赖newkeyword
本系列作为EffectiveJavaScript的读书笔记. 在将function当做构造函数使用时,须要确保该函数是通过newkeyword进行调用的. function User(name, pa ...
- 读书笔记 effective c++ Item 43 了解如何访问模板化基类中的名字
1. 问题的引入——派生类不会发现模板基类中的名字 假设我们需要写一个应用,使用它可以为不同的公司发送消息.消息可以以加密或者明文(未加密)的方式被发送.如果在编译阶段我们有足够的信息来确定哪个信息会 ...
- Effective JavaScript Item 38 调用父类的构造函数在子类的构造函数
作为这一系列Effective JavaScript的读书笔记. 在一个游戏或者图形模拟的应用中.都会有场景(Scene)这一概念.在一个场景中会包括一个对象集合,这些对象被称为角色(Actor). ...
- Effective C++ Item 36 绝不又一次定义继承而来的 non-virtual 函数
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:绝对不要又一次定义继承而来的 non-virtual 函数 --> Item 7 ...
- 读书笔记 effective c++ Item 36 永远不要重新定义继承而来的非虚函数
1. 为什么不要重新定义继承而来的非虚函数——实际论证 假设我告诉你一个类D public继承类B,在类B中定义了一个public成员函数mf.Mf的参数和返回类型并不重要,所以假设它们都是void. ...
随机推荐
- SpringKafka生产端配置类ProducerConfig.java源码
/** * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreeme ...
- spring使用rssfeed
spring使用rssfeed import org.springframework.stereotype.Controller; import org.springframework.web.bin ...
- 在ajax post处理文件下载
我有一个JavaScript应用程序需要使用ajax post请求发送到某个URL,然后后端会根据请求中的参数进行相应的工作,生成一个可下载的压缩包,等待下载.必须使用的ajax的原因是这里需要模拟提 ...
- 一个activity
package com.example.administrator.Activity; import android.content.Context;import android.content.In ...
- ServiceMetadataBehavior 的 HttpsGetEnabled 属性设置为 True,而 HttpsGetUrl 属性是相对地址,但没有 https 基址
WCF 发布,本机正常,服务器报错,信息如下: ServiceMetadataBehavior 的 HttpsGetEnabled 属性设置为 True,而 HttpsGetUrl 属性是相对地址,但 ...
- signal(SIGCHLD, SIG_IGN)和signal(SIGPIPE, SIG_IGN);
signal(SIGCHLD, SIG_IGN); //忽略SIGCHLD信号,这常用于并发服务器的性能的一个技巧 //因为并发服务器常常fork很多子进程,子进程终结之后需要//服务器进程去wait ...
- Andriod——数据存储 SharedPrefrences
xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= ...
- linux挂载根文件系统过程
linux-2.6.36内核 start arch/arm/boot/compressed/head.S arch/arm/kernel/head.S start_kernel() ...
- PHP框架之ThinkPHP项目CMS内容管理系统源码及开发手册视频
http://download.csdn.net/download/duguqing/4203042
- 【转载】C#进阶系列——动态Lamada(二:优化)
前言:前几天写了一篇动态Lamada的文章C#进阶系列——动态Lamada,受园友xiao99的启发,今天打算来重新优化下这个动态Lamada的工具类.在此做个笔记,以免以后忘了. 一.原理分析 上篇 ...