Bjarne Stroustrup的《c++语言的设计和演化》,裘宗燕 译,机械工业出版社。
下面是原文:(蓝色)(问题在后面给出)
3.5.3 基成员的遮蔽
派生类里的名字将遮蔽基类中具有相同名字的任何对象或函数。这是不是一个好的设计决定,这件事称为许多年来争论的主题。这个规则最先是由带类的C引进的,我把它看作是普通作用域规则的必然推理。在有关这个问题的争论中,我一直认为与此相反的意见——将派生类和基类的名字合并到同一个作用域——至少会带来许多问题。特别是有可能错误地对子对象调用改变状态的函数:
class X {
int x;
public:
virtual void copy(X* p) {x = p->x;}
};
class XX: public X {
int xx;
public:
virtual void copy(XX* p) {xx = p->xx; X::copy(p);}
};
void f(X a, XX b)
{
a.copy(&b); //ok: copy X part of b
b.copy(&a); //error: copy(X*) is hidden by copy(XX*)
}
如果合并了基类和派生类的作用域,那么第二个copy操作也就允许做了,而这将导致b的状态被部分更改的问题。大多数情况下这将导致对XX对象的操作出现非常奇怪的行为。我确实看到过人们被这种方式套住,他们使用的是GUN的C++编译系统,该编译系统允许这种重载。
如果copy()是虚函数,我们可以认为XX::copy()覆盖了X::copy(),而这时就需要做运行时的检查才能捕捉到b.copy(&a)的问题,程序员也必须按防御的方式编程,以便在运行中捕捉到这种错误。当时已经理解了这种情况,但我害怕还有什么自己尚未理解的问题,因此就选择了现在这种最严格、最简单和最有效的规则。
问题:未能理解“虚函数”小节中的“基成员的遮蔽”,
1,为什么合并了基类和派生类的作用域,第二个copy操作就允许做了,这将导致b的状态被部分改变,如何改变的(请结合给出的例子)?
2,请给出你对原文的理解。
ps:我把c++ primer plus看了快两遍了,感觉自己实际能力还很不够,我该从哪方面入手来突破这一瓶颈。谢谢!