为什么我不能访问具有受保护的重载的公共函数?

neu*_*rte 3 c++ overloading protected

鉴于代码:

class Foo
{
public:
    Foo() {}

    int foo() const { return 6; }
protected:
    int foo() { return 5; }
};

int main(int argc, char* argv[])
{
    Foo foo;
    foo.foo();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到编译错误:

'Foo :: foo':无法访问类'Foo'中声明的受保护成员

在实际使用中,我正在尝试提供一个函数,该函数返回指向类所存储的对象的指针 - 可以为成员修改,而const则为其他所有人修改.我想如果我说的话

const Item *i = foo.foo();
Run Code Online (Sandbox Code Playgroud)

在非成员函数中,将调用正确的const变量.不知何故,编译器坚持访问受保护部分中的非const变体.知道为什么吗?谢谢.

Rob*_*edy 8

您的变量是非const的,因此选择了函数的非常量重载.发生重载解析后,将检查可访问性.

当const和非const函数都存在时,const版本仅在const对象上调用.你的foo变量不是const.如果你愿意,你可以使用a 使其成为const const_cast:

const_cast<Foo const&>(foo).foo();
Run Code Online (Sandbox Code Playgroud)

但是,使用起来很麻烦.更好的解决方案是给内部函数一个不同的名称,这样它就不会与外部API发生冲突.