首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

继承与遮掩有关问题

2012-11-07 
继承与遮掩问题继承与遮掩问题继承:pure virtual 函数的目的是为了让Derived class 只继承函数接口。impure

继承与遮掩问题

继承与遮掩问题

继承:
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类中的函数(别忘了,原来意义的重载只可以重载当前类中的函数)。

 

转载请注明来自:http://blog.csdn.net/windows_nt


热点排行