18

当派生类成员变量名称隐藏其父类之一时,是否有办法生成警告,例如

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' */
};

-Wshadow上面的代码在使用 g++编译时不会产生警告。

4

3 回答 3

2

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

int val = 0;

if (flag == aval) 
  int val = firstval;
else if (flag == bval)
  int val = secondval;
else if
.
.
.

switch (val)
{

// put cases here

}

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

于 2012-11-29T13:33:44.797 回答
1

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

但是clang6.0.0 有选项-Wshadow-field(包含在 中-Wshadow-all),它提供了您的代码:

main.cxx:43:7:警告:“孩子”阴影成员的非静态数据成员“i”继承自“母亲”类型 [-Wshadow-field]

诠释我; /* NOK 期待警告:'int Child::i' 的声明 shadows 'int Mother::i' */

main.cxx:34:7: 注意:在这里声明

于 2019-11-26T09:09:33.157 回答
-5

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

于 2012-07-17T12:19:23.390 回答