С++ генерирует предупреждение, когда член класса теневой член класса своего родителя?
Есть ли способ генерировать предупреждение, когда имя переменной члена производного класса затеняет один из его классов родителей, например
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++.
Ответы
Ответ 1
Я действительно видел следующий код, который показывает необходимость теневых предупреждений.
int val = 0;
if (flag == aval)
int val = firstval;
else if (flag == bval)
int val = secondval;
else if
.
.
.
switch (val)
{
// put cases here
}
Я также видел теневые предупреждения, в которых внутренняя переменная должна была быть локальной, не влияют на внешнюю переменную, и затененная переменная не должна была ссылаться. На самом деле было проще просто изменить имя, чтобы предотвратить предупреждение.
Ответ 2
Это не покажет предупреждение, потому что это разрешено. Это возможно, потому что "в этой области фактически определено не более одного из имен, другие будут просто видны в этой области действия. Правила разрешения имен определяют, какое имя выбрано, если есть несколько кандидатов... Вы действительно не хотят давать предупреждение для каждого случая, когда компилятор выбирает альтернативы". - @MSalters.