I'm trying to understand member shadowing in inheritance.
Consider this code with inheritance where both classes have a public data member named x
.
class A {
public:
int x;
};
class B : public A {
public:
int x;
};
int main(void)
{
B test;
return 0;
}
When I compile this with : c++ -Wshadow file.cpp
I don't get any warnings. This confuses me because my understanding is that shadowing occurs when an inner scope declares a name that's already declared in an outer scope.
In this case, B::x
seems to be shadowing A::x
, and the shadowing is real because to access A::x
in B
, I would need to use scope resolution: test.A::x
What am I missing about how -Wshadow
works with inheritance? Is this not considered shadowing, or is there something special about member variables in inheritance?
-Wshadow
warns about local variables:
Warn whenever a local variable or type declaration shadows another variable, parameter, type, class member (in C++), or instance variable (in Objective-C) or whenever a built-in function is shadowed. Note that in C++, the compiler warns if a local variable shadows an explicit typedef, but not if it shadows a struct/class/enum. If this warning is enabled, it includes also all instances of local shadowing. This means that
-Wno-shadow=local
and-Wno-shadow=compatible-local
are ignored when-Wshadow
is used. Same as-Wshadow=global
.
For example:
class A {
public:
int x = 0;
};
class B : public A {
void foo() {
int x; // warning: declaration of 'x' shadows a member of 'B'
}
};
In your example x
is not a local variable.
The documentation does not mention warning about member variables that shadow a member from a base.
There is no deeper reason to this other than this is how GCC implements the warning. Note that e.g., Clang does also not warn for my example (see here).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With