当前位置:编程学习 > VC++ >>

继承中的遮掩问题

继承中的遮掩问题

以作用域为基础的“名称遮掩规则”同样适用于类的继承。而且不论函数是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类中的函数(别忘了,原来意义的重载只可以重载当前类中的函数)。

补充:软件开发 , Vc ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,