Avoid hiding inherited names.
我们先来看看什么是遮掩:
int x; fun(){ double x; cin>>x; }
对于上面的代码来说我们输入的是double型的x,而不是int型的。因为他被遮掩了。
- C++的名称遮掩规则(name-hiding rules)所做的唯一事情就是:遮掩名称。至于名称是不是相同的类型并不重要。从上面的例子也能看出来。
- 我们来看看继承中的名称遮掩:
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声明,让本层能看见上层的相应东西。(参见上面注释代码)。
- 关于转交函数(forwarding functions),一种用于使名称可见的函数设计方式。这里就不介绍了。
请记住
- derived classes内的名称会遮掩base classes内的名称。在public继承下 从来没有人希望如此。
- 为了让被遮掩的名称在见天日,可以使用using声明或转交函数(forwarding functions)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)