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

当位于一个子类成员函数内指涉父类内的某物时,编译器可以找出我们所指涉的东西,意味子类继承了声明于父类内的所有东西。实际运作方式是:子类的作用域被嵌套在父类的作用域中,但在子类找不到定义时,作用域替换为父类的作用域。

class Base{

private:

int x;

public:

     virtual void mf1() =0;

     virtual void mf1(int);

      virtual void mf2();

       void mf3();

       void mf3(double);

       ...

};

class Derived: public Base {

public:

       virtual void mf1();

      void mf3();

        void mf4();

      ...

};

Derived d;

int x;

...

d.mf1();           //没问题,调用derived::mf1

d.mf1(x);           //错误!因为Derived::mf1遮掩Base::mf1

d.mf2();          //没问题,调用Base::mf2

d.mf3();            //没问题,调用Derived::mf3

d.mf3(x);              //错误!因为Dervied::mf3 遮掩了Base::mf3

即使子类和父类内的函数有不同的参数类型也会覆盖作用域,因为是按照函数名在作用域中寻找声明式,如果在子类找到无参的函数名,就不会再去父类找有参的函数名。如果子类没有声明式,就会报错。

你可以使用using 声明式达成目标

class Base{

private:

    int x;

public:

        virutal void mf1() =0;

          virtual void mf1(int );

         virtual   void mf2();

           void mf3();

            void mf3(double);

.....

};

  class Derived:public Base{

 public:

        using Base::mf1;           //让Base class内名为mf1和mf3的所有东西在Derived作用域都可见。

         using Base::mf3;

       virtual void mf1();

           void mf3();

            void mf4();

          ...

};

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值