继承与遮掩问题(一)

2013-01-09 14:10:50 · 作者: · 浏览: 792

  继承:

  pure virtual 函数的目的是为了让Derived class 只继承函数接口。

  impure virtual(虚) 函数的目的是让Derived class 继承该函数的接口和缺省实现。

  non-virtual(普通) 函数的目的是为了令Derived class 继承函数的接口及一份强制性实现。如果成员函数是个non-virtual函数,意味着它并不打算在Derived class中有不同的行为。

  遮掩:

  以作用域为基础的"名称遮掩规则"同样适用于类的继承。而且不论函数是virtual或non-virtual都一体适用。

  事例:

  Derived class 内的名称会遮掩 Base class 内的名称。

  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)       //错误,因为Derived::mf3遮掩了Base::mf3

  为了让遮掩的名称再见天日,可使用using 声明式或转交函数。