阴影是坏还是好取决于您引入冲突名称的顺序。
假设您有一个类库,其中一个类是这样的:
struct Base {
int a;
};
后来,正在使用你的类库的客户A这样写:
class DerivedA : public Base {
private:
int a;
};
在这种情况下,阴影可能是无意的。顾客不小心跟了影子Base::a
.
但是,假设您还有客户 B,他写道:
class DerivedB : public Base {
private:
int b;
};
到目前为止,一切都很好。现在您构建了您的库,以便它使用Base
对象,并且使用您的库的客户 B 构建了一个使用这两者的代码体Base
and DerivedB
对象。
几周后,您意识到为了获得新功能,您需要向Base
.
struct Base {
int a;
int b; // new member variable
};
这会给您的图书馆带来问题吗?这会给客户 B 带来问题吗?
不,它不会产生任何问题。
所有使用的代码Base
将继续使用Base
,并且它可以使用b
会员即可获得精美新品b
特征。即使DerivedB
对象被传递给一个需要a的函数Base
,事实是Derived
正在跟踪b
没有影响Base
。你的函数使用Base
可以说b
它将访问Base
成员变量。
同时,客户 B 的所有代码使用DerivedB
将继续使用DerivedB
,当该代码说b
,得到DerivedB::b
,就像以前一样。唷,影子拯救了这一天!
(当然,如果客户 B 想要开始利用新的b
功能,那么客户 B 必须做额外的工作来解决冲突。但重要的是,阴影不会在现有代码中产生任何新问题。)
归根结底,阴影是好还是坏取决于您引入冲突名称的顺序。这不是编译器能够洞察的事情。