我正在尝试理解继承中的成员影子。
考虑此带有继承的代码,其中两个类都有一个名为
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
如何与继承一起工作缺少什么?这算不算影子,还是继承中的成员变量有什么特别之处?
-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 也不会针对我的示例发出警告(请参阅此处)。