18

派生クラスのメンバー変数名が親クラスの 1 つを隠している場合に警告を生成する方法はありますか?

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 に答える
-5

これは許可されているため、警告は表示されません。「名前の1つが実際にそのスコープで実際に定義されているため、可能です。他の名前はそのスコープでのみ表示されます。名前解決ルールは、複数の候補がある場合、どの名前が選択されるかを決定します...あなたは本当にそうしますコンパイラが代替案を選択するたびに警告を出したくありません。」- @MSalters

于 2012-07-17T12:19:23.390 に答える