5.条款之避免继承而来的名称
int x;
void someFunc()
{
double x;
std::cin >> x;
}
我们都知道上面这段代码会因为局部变量的原因,输入的x是double类型的
根据以上代码,我们来看看下面的类:
#include <iostream>
using namespace std;
class Base{
private:
int x;
public:
virtual void mf1(int)
{
cout<<"Base mf1"<<endl;
}
};
class Derived:public Base{
public:
virtual void mf1()
{
cout<<"Derived mf1"<<endl;
}
};
int main()
{
Derived d;
int x;
d.mf1(); //没问题,调用Derived::mf1
//d.mf1(x);
return 0;
}
结果:
结果如我们所想,调用的是Derived类的mf1
注意:当我们把注释掉的d.mf1(x)释放掉,就会报错,它不会调用到Base里面的mf1函数,原因就是“继承而来的名称”的缺省遮掩行为。
而我们肯定想的是我们要用到Base里面的mf1函数,该如何实现
贴上以下代码:
#include <iostream>
using namespace std;
class Base{
private:
int x;
public:
virtual void mf1(int)
{
cout<<"Base mf1"<<endl;
}
};
class Derived:public Base{
public:
using Base::mf1;
virtual void mf1()
{
cout<<"Derived mf1"<<endl;
}
};
int main()
{
Derived d;
int x;
d.mf1(); //没问题,调用Derived::mf1
d.mf1(x);
return 0;
}
结果如下:
使用using声明,让我们继承相同的名称函数不会被遮掩住。
参考文献《Effective C++》作者 Scott Meyers 翻译 候捷