Effective C++ Item 33 Avoid hiding inherited names
2014-03-01 12:44
495 查看
class Base { private: int x; public: virtual void mf1() = 0; 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() = 0; 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(); ... } };
相关文章推荐
- 打印一个九九乘法表
- C++之类,类的数组,一次实例化多个类的实例。
- 高级算法课程(一):模拟退火算法SA()及其C++代码
- C++拷贝构造函数及重写operator =的区别
- C语言虐心记
- C语言实现继承和多态
- C语言中char变量详解
- 【c++】大数相加
- C++编译器与链接器工作原理
- C++中的前置声明
- C与C++的区别,枚举类型enum
- SEH——Structured Exception Handling(结构化异常处理)
- c++容器总结
- C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)
- UVA 10106高精度乘法
- gsoap编译工具的安装与使用(二)----工具的使用及问题的解决
- C语言条件编译及编译预处理阶段
- [C++_4]static_const_mutable
- C++ COM编程生成随机GUID值
- C++中如何表示2进制,8进制、16进制变量