本文主要是介绍避免掩蔽继承而来的名称,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
此例内含一组混合了public和private名称,以及一组成员变量和成员函数名称。这些成员函数包括pure virtual,impure virtual和non-virtual三种。假设derived class内的mf4的实现代码是这样的:
void Derived::mf4()
{...mf(2)...
}
这里编译器看到这里使用名称mf2,必须估算它指涉什么东西。编译器的做法是查找各个作用域。首先查找local作用域,就是mf4覆盖的作用域,没用找到mf2,于是查找外围作用域,也就是class Derived覆盖的作用域,还是没有找到mf2,于是再往外围找,在base class找到。
再考虑前一个例子,这次我们重载mf1和mf3,并且添加一个新的mf3到Derived。这里发生的事情是:Derived 重载了mf3,那是一个继承而来的non-virtual函数。如下:
以作用域为基础的“名称遮掩规则”并没有改变,因此base class内所有名为mf1和mf3的函数被derived class内的mf1和mf3函数遮掩掉了。从名称查找看,Base::mf1和Base::mf3不再被Derived继承。
Derived d;
int xd.mf1(); //调用Derived::mf1
d.mf1(x); //错误,Derived::mf1遮掩了Base::mf1
d.mf2(); //调用Base::mf2
d.mf3(); //调用Derived::mf3
d.mf3(x); //错误,调用Derived::mf3()遮掩了Base::mf3()
接着看:
Derived d;
int xd.mf1(); //调用Derived::mf1
d.mf1(x); //调用Base::mf1
d.mf2(); //调用Base::mf2
d.mf3(); //调用Derived::mf3
d.mf3(x); //调用Base::mf3()
这意味着如果你继承base class并加上重载函数,而你又希望重新定义或覆盖其中一部分,那么你必须为那些原本会被遮掩的每个名称引入一个using声明,否则某些你希望继承的名称会被遮掩。
(来自Effective c++)
这篇关于避免掩蔽继承而来的名称的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!