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

C++箴言:避免覆盖通过继承得到的名字,第1张

C++箴言:避免覆盖通过继承得到的名字,第2张

莎士比亚有一句关于名字的谚语。“名字里有什么?”他问道:“玫瑰换个名字也会一样小一样甜。”(出自《罗密欧与朱丽叶》第二幕第二场,朱生豪先生译:“名字毫无意义;这朵我们称之为玫瑰的花,如果我们换个名字,它的香味还是一样的。”梁实秋先生译:“姓什么?我们说有玫瑰。如果我们改了名字,它们闻起来还是一样的。”——译者注)。莎士比亚还写道“谁偷走了我的好名声...让我变穷了。”(摘自《奥特罗》第三幕第三场,朱生豪先生翻译为:“但无论是谁窃取了我的名誉,尽管他并没有因此而富有,我却因为失去了它而变得一贫如洗。”梁实秋先生翻译,“但他若拿走我的名誉,对他无益,反而是我的损失。”——译者注)。那么,在C++中,我们应该对通过继承获得的名字采取什么样的态度呢?

事情的本质与继承无关。与范围有关。我们都知道在代码中是这样的,

int x;//全局变量

void some func()
{
double x;//局部变量

STD::CIN > > x;//读取局部x的新值
}

在X中读取的语句指的是局部变量X,而不是全局变量X,因为内部作用域的名称覆盖(“模糊”)了外部作用域的名称。我们可以像这样直观地表示作用域的状态:

当编译器在someFunc的作用域中遇到名称X时,它们会在局部作用域中巡视,看是否有任何具有该名称的内容。因为有,他们就不再查其他范围了。在这个例子中,someFunc的x类型是double,而全局的x类型是int,但这无关紧要。C++的名字隐藏规则正好涵盖了那个名字。对应名称的类型是否相同并不重要。在这个例子中,一个名为x的double覆盖了一个名为x的int。

加入传承后。我们知道,当我们在派生类成员函数中引用基类中的某些内容(例如,成员函数、typedef或数据成员)时,编译器可以找到我们引用的内容,因为派生类继承了基类中声明的内容。中的实际操作方法是将派生类的作用域嵌套在基类的作用域中。例如:

基类{
private:
int x;

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

...
};

类派生类:public Base {
public:
virtual void mf1();
void mf4();
...
};

此示例包含公共名称和私有名称,以及数据成员和成员函数。成员函数包括纯虚拟、简单(冲动)虚拟和非虚拟。那是为了强调我们说的是名字。示例还可以包括其他类型的名称,如枚举、嵌套类和typedefs。这里讨论的重点是“它们是名字”。这与它们的名称无关。在这个例子中使用了单继承,但是一旦你理解了在单继承下会发生什么,C++在多继承下的行为就很容易预测了。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++箴言:避免覆盖通过继承得到的名字

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情