Подтвердить что ты не робот

С++ генерирует предупреждение, когда член класса теневой член класса своего родителя?

Есть ли способ генерировать предупреждение, когда имя переменной члена производного класса затеняет один из его классов родителей, например

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++.

4b9b3361

Ответ 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.