为什么 GCC 的 -Wshadow 标志没有被提升以用于此代码的继承中的成员变量遮蔽?

问题描述 投票:0回答:1

我正在尝试理解继承中的成员影子。

考虑此带有继承的代码,其中两个类都有一个名为

x
的公共数据成员。

class A {
    public:
        int x;
};

class B : public A {
    public:
        int x; 
};

int main(void)
{
    B test;
    return 0;
}

当我用以下命令编译它时:

c++ -Wshadow file.cpp
我没有收到任何警告。这让我很困惑,因为我的理解是,当内部作用域声明一个已经在外部作用域中声明的名称时,就会发生阴影。

在这种情况下,

B::x
似乎正在遮蔽
A::x
,并且遮蔽是真实的,因为要访问
A::x
中的
B
,我需要使用范围解析:
test.A::x

我对

-Wshadow
如何与继承一起工作缺少什么?这算不算影子,还是继承中的成员变量有什么特别之处?

c++ oop inheritance g++ shadowing
1个回答
6
投票

-Wshadow
关于局部变量的警告:

每当局部变量或类型声明遮盖另一个变量或类型声明时发出警告 变量、参数、类型、类成员(在 C++ 中)或实例变量 (在 Objective-C 中)或每当内置函数被隐藏时。笔记 在 C++ 中,如果局部变量隐藏了某个变量,编译器会发出警告 显式 typedef,但如果它隐藏了结构/类/枚举,则不会。如果这个 启用警告后,它还包括本地阴影的所有实例。 这意味着

-Wno-shadow=local
-Wno-shadow=compatible-local
是 使用
-Wshadow
时忽略。与
-Wshadow=global
相同。

例如:

class A {
    public:
        int x = 0;
};

class B : public A { 
    void foo() {
        int x;  // warning: declaration of 'x' shadows a member of 'B'
    }    
};

在您的示例中

x
不是局部变量。

文档没有提到有关从基础隐藏成员的成员变量的警告。

除了 GCC 如何实施警告之外,没有更深层的原因。请注意,例如,Clang 也不会针对我的示例发出警告(请参阅此处)。

© www.soinside.com 2019 - 2024. All rights reserved.