条款 33 :避免遮掩继承而来的名称

本文详细介绍了C++中的名称遮掩现象,特别是在继承中的应用。当派生类中的成员变量或函数与基类同名时,基类的名称会被遮掩。通过使用`using`声明或转发函数,可以避免这个问题,确保能够正确调用基类的成员。文章强调了理解名称遮掩规则的重要性,并提供了示例代码来说明如何处理这种问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

条款 33 :避免遮掩继承而来的名称

Avoid hiding inherited names.

我们先来看看什么是遮掩:

int x;
fun(){
    double x;
    cin>>x;
}

对于上面的代码来说我们输入的是double型的x,而不是int型的。因为他被遮掩了。

  1. C++的名称遮掩规则(name-hiding rules)所做的唯一事情就是:遮掩名称。至于名称是不是相同的类型并不重要。从上面的例子也能看出来。
  2. 我们来看看继承中的名称遮掩:
class Base{
    private:
    	int x;
    public:
    	virtual void f1()=0;
    	virtual void f1(int);//mf1的重载
    	virtual void f2();
    	void f3();
    	virtual void f3(double);//重载
    	...
};
class Derived:public Base{
    public:
    	virtual void f1();
    	// using Base::f1;
    	//using Base::f3
    	void f3();
    	void f4();
};


Derived d;
int x;
...
d.f1();//没问题,调用Derived::f1
d.f1(int x);//错误,因为Derived::f1遮掩了Base::f1(带上using声明就没错了)
d.f2();//没问题,调用Base::f2
d.f3();//没问题,调用Derived::f3
d.f3(int x);//错误,因为Derived::f3遮掩了Base::f3(带上using声明就没错了)

上述代码中使用这么多类型 ,包括重载等只是为了强调一件事情:C++的名称遮掩 规则仅仅只进行名称的遮掩,关于其他的(例如返回类型,类型,是不是虚的,甚至参数等)都不考虑。如果你想在调用一个被覆盖的重载基类函数时,一个简单方法就是使用using声明,让本层能看见上层的相应东西。(参见上面注释代码)。

  1. 关于转交函数(forwarding functions),一种用于使名称可见的函数设计方式。这里就不介绍了。

请记住

  1. derived classes内的名称会遮掩base classes内的名称。在public继承下 从来没有人希望如此。
  2. 为了让被遮掩的名称在见天日,可以使用using声明或转交函数(forwarding functions)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值