设为首页 加入收藏

TOP

继承中的遮掩问题
2014-11-23 17:44:58 】 浏览:5258
Tags:继承 遮掩 问题

继承中的遮掩问题

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

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Visual C++ 2012 Express 缺少win.. 下一篇 VC++6.0调试工具使用初步

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目