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

时间:2012-02-28 03:19:42

标签: 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;
}

我收到编译错误:

  

'Foo :: foo':无法访问类'Foo'

中声明的受保护成员

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

const Item *i = foo.foo();

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

2 个答案:

答案 0 :(得分:8)

您的变量是非常量的,因此选择了函数的非常量重载。 发生重载解析后,检查然后辅助功能。

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

const_cast<Foo const&>(foo).foo();
但是,使用它很麻烦。更好的解决方案是给内部函数一个不同的名称,这样它就不会与外部API冲突。

答案 1 :(得分:3)

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

foo的类型为Foo,而不是const Foo,这就是编译器选择非protected的{​​{1}}版本的原因。

代码将以3种方式编译:

  1. const
  2. 中设置Foo::foo()
  3. 或者,使用public,以便编译器选择const-correct 版本
  4. 删除非const Foo版本