编译器不应该对派生类中隐藏的基本结构的成员变量发出警告吗?

Shouldn't a compiler raise a warning for member variables of base struct shadowed in derived class(es)?

本文关键字:变量 成员 警告 结构 派生 不应该 编译器 隐藏      更新时间:2023-10-16

我意外地遮蔽了一个(基本)结构的某些成员变量,其中私有成员在基本结构中得出的类中。

struct Base {
int a;
}

类派生:公共基础{
私人:
int a;
...

在我的情况下,这是一个错误由于我认为有目的的阴影成员确实很少见(如果根本不考虑不良的习惯),我想知道为什么编译器至少没有提出警告(好的,不是错误,因为合法允许阴影)?

我使用的编译器是Microsoft Visual C 2015,警告级别4)。
我想知道其他编译器(即GCC)是否为这种情况提供了特定的警告?

阴影是否不好还是好取决于您引入冲突名称的顺序。

假设您有一个课堂库,其中一个是:

struct Base {
    int a;
};

稍后,使用您的班级库的客户A写了以下内容:

class DerivedA : public Base {
private:
    int a;
};

在这种情况下,阴影可能是意想不到的。客户意外阴影Base::a

但是,假设您也有客户b,谁写了这一点:

class DerivedB : public Base {
private:
    int b;
};

到目前为止一切都很好。现在,您构建库,因此使用Base对象,使用您的库的客户B构建了同时使用BaseDerivedB对象的代码。

几周后,您意识到要获得新功能,您需要将新成员添加到Base

struct Base {
    int a;
    int b; // new member variable
};

这会为您的库带来问题吗?它是否与客户b?

造成了问题

不,它不会造成任何问题。

使用Base的所有代码都将继续使用Base,并且可以使用b成员获得Fancy新的b功能。即使DerivedB对象传递给了预期Base的函数,Derived正在遮蔽b这一事实对Base没有影响。您使用Base的功能可以说b,它将访问Base成员变量。

同时,使用DerivedB的所有客户B代码将继续使用DerivedB,当该代码称为b时,它会像以前一样获得DerivedB::b。ph,阴影节省了一天!

(当然,如果客户B想要开始利用新的b功能,那么客户B必须做额外的工作以解决冲突。但是重要的是,阴影并没有在现有代码。)

在一天结束时,无论阴影是好还是坏取决于您引入冲突名称的顺序。这不是编译器洞察的东西。