覆盖非const虚方法是否会隐藏const重载?

Ari*_*Ari 7 c++ virtual inheritance const name-lookup

考虑:

#include <iostream>

using namespace std;

struct A {
  virtual void f() { cout << "A::f" << endl; }
  virtual void f() const { cout << "A::f const" << endl; }
};

struct B : public A {};

struct C : public A {
   virtual void f() { cout << "C::f" << endl; }
};


int main()
{
   const B b;
   b.f();   // prints "A::f const"

   const C c;
   c.f();
   // Compile-time error: passing ‘const C’ as ‘this’ argument of
   //   ‘virtual void C::f()’ discards qualifiers
}
Run Code Online (Sandbox Code Playgroud)

(我正在使用GCC.)

所以f()的const版本似乎隐藏在C中.这对我来说很有意义,但是它是否由标准规定?

ice*_*ime 5

我将(再次)链接这篇伟大的文章:

首先,[编译器]查看直接范围,在本例中是C类的范围,并列出它可以找到的名为f的所有函数(无论它们是否可访问,或者是否采用正确的数量参数).只有当它不这样做时才继续"向外"进入下一个封闭的范围 [...]

所以是的,const版本f是隐藏的,这是完全正常的.正如西蒙指出的那样,你可以使用一个using语句来实现A::fC范围.