手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

C 箴言:避免覆盖通过继承得到的名字

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
 莎士比亚有一个关于名字的说法。"What’s in a name?" 他问道,"A rose by any other name would smell as sweet."(语出《罗密欧和朱丽叶》第二幕第二场,朱生豪先生译为:“姓名本来是没有意义的;我们叫做玫瑰的这一种花,要是换了个名字,他的香味还是同样的芬芳。”梁实秋先生译为:“姓算什么?我们所谓有玫瑰,换个名字,还是相同的香。”——译者注)。莎翁也写过 "he that filches from me my good name ... makes me poor indeed."(语出《奥塞罗》第三幕第三场,朱生豪先生译为:“可是谁偷去了我的名誉,那么他虽然并不因此而富足,我却因为失去他而成为赤贫了。”梁实秋先生译为:“但是他若夺去我的名誉,于他不见有利,对我却是一件损失哩。”——译者注)。好吧,在 C 中,我们该用哪种态度对待通过继承得到的名字呢?

  事情的实质和继承没什么关系。他和作用域有关。我们都知道他在代码中是这样的,

int x; // global variable

void someFunc()
{
double x; // local variable

std::cin >> x; // read a new value for local x
}

  读入 x 的语句指涉 local 变量 x,而不是 global 变量 x,因为内层作用域的名字覆盖(“遮蔽”)外层作用域的名字。我们能够像这样形象地表示作用域的状况:


  当编译器在 someFunc 的作用域中碰到名字 x 时,他们巡视 local 作用域看看是否有什么东西叫这个名字。因为那里有,他们就不再检查其他作用域。在此例中,someFunc 的 x 类型为 double,而 global x 类型为 int,但这不要紧。C 的 name-hiding 规则仅仅是覆盖那个名字。而相对应的名字的类型是否相同是无关紧要的。在此例中,一个名为 x 的 double 覆盖了一个名为 x 的 int。

  加入 inheritance 以后。我们知道当我们在一个 derived class member function 内指涉位于 base class 内的一件东西(例如,一个 member function,一个 typedef,或一个 data member)时,编译器能够找到我们指涉的东西是因为 derived classes 继承到声明于 base classes 中的东西。实际中的运作方法是将 derived class 的作用域嵌套在 base class 作用域之中。例如:

class Base {
private:
 int x;

public:
 virtual void mf1() = 0;
 virtual void mf2();
 void mf3();

 ...
};

class Derived: public Base {
public:
 virtual void mf1();
 void mf4();
  ...
};

 莎士比亚有一个关于名字的说法。"What’s in a name?" 他问道,"A rose by any other name would smell as sweet."(语出《罗密欧和朱丽叶》第二幕第二场,朱生豪先生译为:“姓名本来是没有意义的;我们叫做玫瑰的这一种花,要是换了个名字,他的香味还是同样的芬芳。”梁实秋先生译为:“姓算什么?我们所谓有玫瑰,换个名字,还是相同的香。”——译者注)。莎翁也写过 "he that filches from me my good name ... makes me poor indeed."(语出《奥塞罗》第三幕第三场,朱生豪先生译为:“可是谁偷去了我的名誉,那么他虽然并不因此而富足,我却因为失去他而成为赤贫了。”梁实秋先生译为:“但是他若夺去我的名誉,于他不见有利,对我却是一件损失哩。”——译者注)。好吧,在 C 中,我们该用哪种态度对待通过继承得到的名字呢?

  事情的实质和继承没什么关系。他和作用域有关。我们都知道他在代码中是这样的,

int x; // global variable

void someFunc()
{
double x; // local variable

std::cin >> x; // read a new value for local x
}

  读入 x 的语句指涉 local 变量 x,而不是 global 变量 x,因为内层作用域的名字覆盖(“遮蔽”)外层作用域的名字。我们能够像这样形象地表示作用域的状况:


  当编译器在 someFunc 的作用域中碰到名字 x 时,他们巡视 local 作用域看看是否有什么东西叫这个名字。因为那里有,他们就不再检查其他作用域。在此例中,someFunc 的 x 类型为 double,而 global x 类型为 int,但这不要紧。C 的 name-hiding 规则仅仅是覆盖那个名字。而相对应的名字的类型是否相同是无关紧要的。在此例中,一个名为 x 的 double 覆盖了一个名为 x 的 int。

  加入 inheritance 以后。我们知道当我们在一个 derived class member function 内指涉位于 base class 内的一件东西(例如,一个 member function,一个 typedef,或一个 data member)时,编译器能够找到我们指涉的东西是因为 derived classes 继承到声明于 base classes 中的东西。实际中的运作方法是将 derived class 的作用域嵌套在 base class 作用域之中。例如:

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

class Base {
private:
 int x;

public:
 virtual void mf1() = 0;
 virtual void mf2();
 void mf3();

 ...
};

class Derived: public Base {
public:
 virtual void mf1();
 void mf4();
  ...
};
Google