【问题标题】:warning on derived class member shadowing base class member派生类成员阴影基类成员的警告
【发布时间】:2017-11-08 15:47:00
【问题描述】:

当局部变量遮蔽另一个变量时,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
}

https://godbolt.org/g/fBMUAd

这背后有什么原因吗?

【问题讨论】:

标签: c++ visual-c++ g++ compiler-warnings clang++


【解决方案1】:

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

【讨论】:

  • 谢谢,但我没有询问行为,而是询问没有警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 2018-11-30
  • 2017-12-02
  • 1970-01-01
相关资源
最近更新 更多