本条款讲的是关于同名的变量或函数在继承体系中的调用问题。
如下例子:
class Base
{
public:
virtual void mf1();
virtual void mf1(int);
virtual void mf2();
void mf3();
void mf3(int);
void mf4();
};
class Derived: public Base
{
public:
virtual void mf1();
virtual void mf2();
void mf3();
};
Derived d;
int x;
d.mf1();//调用Drived::mf1();
d.mf1(x);//调用失败Base中的mf1(int)被Drived::mf1()函数隐藏。
d.mf2();//调用Drived::mf2();
d.mf3();//调用Drived::mf3();
d.mf3(x);//调用失败Base中的mf3(int)被Drived::mf3()函数隐藏。
d.mf4();//调用Base::mf4();
由上面的代码可知,派生类中的函数隐藏了所有在基类中的同名函数,无论函数参数列表是不是相同。
为了解决这种问题,只要在public作用域下调用using声明就能解决这种问题。如下代码:
class Base
{
public:
virtual void mf1();
virtual void mf1(int);
virtual void mf2();
void mf3();
void mf3(int);
void mf4();
};
class Derived: public Base
{
public:
using Base::mf1;
using Base::mf3;
virtual void mf1();
virtual void mf2();
void mf3();
};
Derived d;
int x;
d.mf1();//调用Drived::mf1();
d.mf1(x);//调用Base中的mf1(int)。
d.mf2();//调用Drived::mf2();
d.mf3();//调用Drived::mf3();
d.mf3(x);//调用Base中的mf3(int)。
d.mf4();//调用Base::mf4();
public 继承的意义是派生类继承基类的所有,包括函数和变量,为了达到拥有并使用的目的,我们必须记住以上所说的特性。