Effective C++ Item 33 避免遮掩继承过来的名称

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie


? 不懂 c++为什么derived classes 内的名称要遮掩 base classes 内的名称。

经验:derived classes 内的名称会遮掩 base classes 内的名称。在 public 继承下从来没有人希望如此。
C++ 的名称遮掩规则所做的唯一事情就是: 遮掩名称
derived class 作用域被嵌套在 base class 作用域里
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{
	virtual void mf1() {};
	void mf3();
	void mf4();
	//... 
};


Derived d;
int x;
d.mf1();  //ok. 调用 Derived::mf1
d.mf1(x); //error. 因为Derived::mf1遮掩了 Base::mf1
d.mf2();  //ok. 调用 Base::mf2
d.mf3();  //ok. 调用 Derived::mf3
d.mf3(x); //error. 因为Derived::mf3遮掩了 Base::mf3

解析:
名称遮掩原则
int x, double x的名称都是x,
void mf(double x) ,void mf()的名称都是mf

纠正1:使用 using 声明式
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:
	using Base::mf1; //让 Base class 内名为mf1和mf3的所有东西在 Derived 作用域内都可见(并且 public)
	using Base::mf3;
	virtual void mf1();
	void mf3();
	void mf4();
	//...
};


Derived d;
int x;
d.mf1();  //ok. 调用 Derived::mf1
d.mf1(x); //ok. Base::mf1
d.mf2();  //ok. 调用 Base::mf2
d.mf3();  //ok. 调用 Derived::mf3
d.mf3(x); //ok. Base::mf3

纠正2:转交函数(forwarding function) 
class Base{
private: 
	int x;
public:
	virtual void mf1() = 0;
	virtual void mf1(int);
	//...  与前同
};
class Derived: private Base{
	virtual void mf1() //转交函数
	{Base::mf1();}
};


Derived d;
int x;
d.mf1(); //ok. 调用的是 Derived::mf1
d.mf1(x);//error. Base::mf1()被遮掩了



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值