继承与遮掩问题

来源:岁月联盟 编辑:exp 时间:2012-11-02

继承与遮掩问题

继承:
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 声明式或转交函数。
事例:
使用using声明式解决遮掩问题。

class Derived: public Base
{
public:
 using Base::mf1;   //让Base class 内名为mf1和mf3的所有东西
 using Base::mf3;   //在Derived 作用域内都可见。
 virtual void mf1();
 void mf3();
 void mf4();
};

Derived d;
int x;

d.mf1();   //没问题,调用Derived::mf1;
d.mf1(x);  //现在没问题了,调用Base::mf1
d.mf2();   //没问题,调用Base::mf2
d.mf3();   //没问题,调用Derived::mf3
d.mf3(x)       //现在没问题了,调用Base::mf3


使用 using 声明还可以做到在Derived类中重载Base类中的函数(别忘了,原来意义的重载只可以重载当前类中的函数)。

 

上一篇:1+2+3+....+19+20=?
下一篇:CF 241C Mirror Box