[effective c++]条款33-name-hiding rules
来源:互联网 发布:调度数据网运行规程 编辑:程序博客网 时间:2024/05/16 01:45
已知如何类定义
Class Base{
private:
int x;
public:
virtual void mf1() = 0;
virtual void mf1() = 0;
virtual void mf2();
void mf3();
void mf3(double);
};
class Derived:public Base {
public:
virtual void mf1();
void mf3();
void mf4();
};
问下面哪些会报错:
Derived d;
int x;
...
d.mf1();//right
d.mf1(x);/wrong
d.mf2();//right
d.mf3();//right
d.mf3(x);//wrong
要回答这个问题,就要先知道一个概念name-hiding rules,名字遮掩规则所做的唯一的事就是:遮掩名称,注意只是名称,而不考虑其参数及返回类型。
在继承类中,因为name-hiding rules的关系,造成基类中的重载的函数也被遮掩了。
这些行为的基本理由是为了防止你在程序库或应用框架内建立新的继承类时附带地从疏远的base classes 继承重载函数。
解决问题的方法:
1.使用using 声明式
Class Base{
private:
int x;
public:
virtual void mf1() = 0;
virtual void mf1() = 0;
virtual void mf2();
void mf3();
void mf3(double);
};
class Derived:public Base {
public:
using Base::mf1;
using Base::mf3;
virtual void mf1();
void mf3();
void mf4();
};
2.如果不想继承base类的所有函数,特别是在private继承下,此时不能采用using声明式,因为会令继承而来的某给定名称的所有同名函数都在继承类中可见。
此时采用forwarding function(转交函数)
Class Base{
private:
int x;
public:
virtual void mf1() = 0;
virtual void mf1() = 0;
virtual void mf2();
void mf3();
void mf3(double);
};
class Derived:public Base {
public:
virtual void mf1(){ // forwarding function
Base::mf1();
}
void mf3();
void mf4();
};
- [effective c++]条款33-name-hiding rules
- 《Effective C++》:条款32-条款33
- Problems in "Effective C++ 3rd editiom" Item 33 - Avoid Hiding inherited name
- 《Effective C++ 》学习笔记-第六章 条款33:避免遮掩继承而来的名称 Avoid hiding inherited names
- Effective C++:条款01
- Effective C++:条款02
- Effective C++:条款03
- Effective C++:条款04
- Effective C++:条款05
- Effective C++:条款06
- Effective C++:条款07
- Effective C++:条款08
- 《effective C++》条款三
- 《effective C++》条款5
- 《effective C++》条款六
- Effective C++--经验条款
- Effective C ++ 条款34
- 《Effective C++》条款05
- ARM linux系统调用的实现原理
- tomcat 配置多虚拟主机 和数据源
- 用API 作简繁体转换
- [SQL Server]收集Agent job信息
- 【项目经验】cocos2d和unity3d的比较
- [effective c++]条款33-name-hiding rules
- CORBA 学习一(概念了解)
- 一个高效的定时器分析及设计
- Java基础19天--03--IO流
- 复制构造函数、赋值操作符与隐式类类型转换
- UML基础: 统一建模语言简介
- 11-09-30 继续无所事事
- AVAudioPlayer 类
- Java基础19天--04--IO流