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

时间:2012-07-17 11:57:23

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

使用带有g ++的-Wshadow编译时,上面的代码不会产生任何警告。

3 个答案:

答案 0 :(得分:2)

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

int val = 0;

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

switch (val)
{

// put cases here

}

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

答案 1 :(得分:0)

在我的测试中,gcc 7.4.0确实没有通过-Wshadow发出警告(也没有其他-Wshadow*标志,并且current documentation并没有显示警告)这种可能性。

但是clang 6.0.0具有选项-Wshadow-field(包含在-Wshadow-all中),该选项提供了您的代码:

  

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

     

int i; / * NOK预期警告:'int Child :: i'的声明在'int Mother :: i'的阴影下* /

     

main.cxx:34:7:注意:在此处声明

答案 2 :(得分:-3)

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