鉴于代码:
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变体。知道为什么吗?感谢。
答案 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种方式编译:
const
Foo::foo()
public
,以便编译器选择const-correct
版本const Foo
版本