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

2008-02-23 05:24:06来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

 莎士比亚有一个关于名字的说法。"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();
  ...
};



[1] [2] [3] 下一页

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 用C 实现跨平台游戏研发之Allegro引擎

下一篇: C 程式中导出Word文档的简易方法

热门词条
热门标签