当类成员遮蔽其父级的类成员时,C++会生成警告

C++ generate a warning when a class member shadow a class member of its parent?

本文关键字:成员 C++ 警告      更新时间:2023-10-16

当派生类成员变量名称遮蔽其父类时,是否有方法生成警告,例如

class Mother 
{
public:
  Mother() : i(0) {}
  virtual ~Mother() {}
protected:
  int i;
};
class Child : public Mother
{
public:
  Child() : Mother(), i(0) {}
  virtual ~Child() {}
protected:
  int i; /* NOK Expecting warning : declaration of 'int Child::i' shadows 'int Mother::i' */
};

以上代码在使用g++的-Wshadow编译时不会生成任何警告。

我实际上看到了如下代码,它显示了阴影警告的必要性。

int val = 0;
if (flag == aval) 
  int val = firstval;
else if (flag == bval)
  int val = secondval;
else if
.
.
.
switch (val)
{
// put cases here
}

我还看到了阴影警告,其中内部变量是本地的,对外部变量没有影响,并且阴影变量不应该被引用。实际上,只需更改名称就可以更容易地防止出现警告。

在我的测试中,gcc 7.4.0确实没有用-Wshadow(也没有用其他-Wshadow*标志)对此显示警告,并且当前文档没有说明这种可能性。

然而,clang 6.0.0有选项-Wshadow-field(包含在-Wshadow-all中),它会在您的代码上显示:

main.ccxx:43:7:警告:从类型"Mother"继承的"Child"shadows成员的非静态数据成员"i"[-Wshadow field]

int i;/*NOK预期警告:声明"int Child::i"shadows"int Mother::i"*/

main.ccxx:34:7:注意:此处声明

这不会显示警告,因为这是允许的。这是可能的,因为"其中一个名称中最多有一个在该范围内实际定义;其他名称仅在该范围中可见。如果有多个候选名称,则名称解析规则决定选择哪个名称……您真的不想在编译器在备选名称之间进行选择的每种情况下都发出警告。"-@MSchangers。