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

Why can't I access a public function that has a protected overload?

本文关键字:重载 函数 受保护 访问 为什么      更新时间:2023-10-16

给定代码:

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;
}

我得到一个编译错误:

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

在实际使用中,我试图提供一个函数,该函数返回一个指向类正在存储的对象的指针——对于成员是可修改的,对于其他所有人是const。我想如果我说

const Item *i = foo.foo();

在非成员函数中,将调用正确的const变量。尽管如此,编译器还是坚持访问受保护部分中的非常量变量。知道为什么吗?谢谢

您的变量是非常数,因此会选择函数的非常数重载发生过载解决后,然后检查可访问性。

当const和非常量函数都存在时,只在const对象上调用const版本。您的foo变量不是常量。如果需要,您可以使用const_cast使常量:

const_cast<Foo const&>(foo).foo();

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

对于非const对象,如果两者都存在,则选择非const函数重载而不是const函数。

foo的类型是Foo而不是const Foo,这就是编译器选择非constprotected版本的原因。

代码将以3种方式编译:

  1. 要么,在public中生成Foo::foo()
  2. 或者,使用const Foo,以便编译器选择正确的常量版本
  3. 删除非const版本