当一个类成员影响其父类的成员时,C++会生成警告?

14 c++ gcc

当派生类成员变量名称影响其父类之一时,有没有办法生成警告,例如

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' */
};
Run Code Online (Sandbox Code Playgroud)

-Wshadow使用g ++ 编译时,上面的代码不会生成警告.

小智 -5

这不会显示警告,因为这是允许的。这是可能的,因为“最多其中一个名称实际上是在该范围内定义的;其他名称仅在该范围内可见。名称解析规则决定选择哪个名称,如果有多个候选者......你确实这样做不想对编译器在替代方案之间进行选择的每种情况发出警告。” - @MSalters

  • 编译器会警告许多允许的事情;当不允许某些内容时,编译器会生成错误,而不是警告。警告表明您可能做了一些无意的事情。 (9认同)
  • 根据我的经验,阴影几乎总是一个编程错误。这里和那里有一些例外,比如 MacOS 具有诸如“Line”之类的全局内容,它将触发该名称的变量的影子警告,但在 gcc 上,我有 -Wshadow (无论如何我有 -Werror)警告(clang++ 和 Visual C++ 更容易设置:-))。就我个人而言,我什至会投票支持一项更改,强制您对所有应该覆盖其他内容的内容进行“覆盖”,即使它只是一个“i”在嵌套循环中隐藏另一个“i”。 (3认同)