派生类成员遮蔽基类成员的警告

Dvi*_*aki 5 c++ g++ compiler-warnings visual-c++ clang++

C++ 编译器会在局部变量隐藏另一个变量时发出警告。例如https://godbolt.org/g/TYYf8F

然而,当派生类的成员隐藏基类的成员时,没有一个主要的 C++ 编译器发出警告:

class A
{
    int _memberVar = 2;

  public:
    virtual int memberVar()
    {
        return _memberVar;
    }
};

class B : public A
{
    int _memberVar = 3;
};

int main()
{
    A* pB = new B();
    return pB->memberVar(); // returns 2
}
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/g/fBMUAd

背后有原因吗?

小智 -2

虚拟是函数调用者中决定调用哪个函数的机制。它不会使该函数以某种方式表现为“虚拟”。由于您没有覆盖函数 B::memberVar(),它仍然调用 A::memberVar(),并且其行为与 A 的任何其他成员函数一样。