本文主要是介绍Effective C++ 条款33,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本条款讲的是关于同名的变量或函数在继承体系中的调用问题。
如下例子:
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 继承的意义是派生类继承基类的所有,包括函数和变量,为了达到拥有并使用的目的,我们必须记住以上所说的特性。
这篇关于Effective C++ 条款33的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!