[effective c++]条款33-name-hiding rules

来源:互联网 发布:调度数据网运行规程 编辑:程序博客网 时间:2024/05/16 01:45

已知如何类定义

 Class Base{

 private:

      int x;

public:

      virtual void mf1() = 0;

      virtual void mf1() = 0;

      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();//right

d.mf1(x);/wrong

d.mf2();//right

d.mf3();//right

d.mf3(x);//wrong


要回答这个问题,就要先知道一个概念name-hiding rules,名字遮掩规则所做的唯一的事就是:遮掩名称,注意只是名称,而不考虑其参数及返回类型。

在继承类中,因为name-hiding rules的关系,造成基类中的重载的函数也被遮掩了。

这些行为的基本理由是为了防止你在程序库或应用框架内建立新的继承类时附带地从疏远的base classes 继承重载函数。


解决问题的方法:

1.使用using 声明式

 Class Base{

 private:

      int x;

public:

      virtual void mf1() = 0;

      virtual void mf1() = 0;

      virtual void mf2();

      void mf3();

      void mf3(double);

};

class Derived:public Base {

public:

    using Base::mf1;

    using Base::mf3;

     virtual void mf1();     

     void mf3();

     void mf4();

};

2.如果不想继承base类的所有函数,特别是在private继承下,此时不能采用using声明式,因为会令继承而来的某给定名称的所有同名函数都在继承类中可见。

此时采用forwarding function(转交函数)

 Class Base{

 private:

      int x;

public:

      virtual void mf1() = 0;

      virtual void mf1() = 0;

      virtual void mf2();

      void mf3();

      void mf3(double);

};

class Derived:public Base {

public:

     virtual void mf1(){ // forwarding function

            Base::mf1();

     }     

     void mf3();

     void mf4();

};



原创粉丝点击