Effective C++读书笔记(33)

来源:互联网 发布:怪物世界源码 编辑:程序博客网 时间:2024/05/21 09:49

条款33:避免遮掩继承而来的名称

对于继承的父类中的函数,如果在子类中有同名的函数,则父类中的同名函数都将被隐藏,例如:

class Base{private:int x;public:virtual void mf1() = 0;virtual void mf1(int x);virtual void mf2();void mf3();void mf3(doubel);};class Derived : public Base{public:virtual void mf1();void mf3();void mf4();};Derived d;int x;d.mf1();d.mf1(x) //错误,父类中的mf1同名的函数被子类中的函数名隐藏d.mf2(); //调用父类的mf2函数d.mf3()d.mf3(x)//错误, 父类中的mf3同名的函数被子类中的函数名隐藏d.mf4();

在上面的例子中,base类中的mf3、mf4和mf1中的所有同名字的函数都被子类中的函数给隐藏了,即使是参数类型不同

的或者virtual和no-virtual函数都是有同样的效果的!为了能够防止父类中的同名函数被隐藏我们可以在子类中用using来引入父类

的成员函数如:

class Derived : public Base{public:using Base::mf1;using Base::mf3;virtual void mf1();void mf3();void mf4();};

在public继承的体系中,子类不应该要隐藏父类的成员函数,因为这样就与public继承的原理要背驰,public继承就是保证

父类的所有函数在子类中都是相同的!在子类中主动的调用父类的成员函数我们可以通过Base::mf1来实现!


请记住:

  • Drived classes内的名称会遮盖带Base class内的名称,在public继承体系中这样做事不合适的!
  • 为了让被遮掩的名称那个再见天日,可以使用using声明或者转交函数(即在子类函数中主动调用父类的函数通过Base::mf1)


原创粉丝点击