当派生类成员变量名称影响其父类之一时,是否有办法生成警告,例如
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
编译时,上面的代码不会产生任何警告。
答案 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。