给定代码:
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' : cannot access protected member declared in class 'Foo'
在实际使用中,我试图提供一个函数,该函数返回一个指向类正在存储的对象的指针——成员可修改,其他人为常量。我想如果我说
const Item *i = foo.foo();
在非成员函数中,将调用正确的 const 变体。但是不知何故,编译器坚持访问 protected 部分中的非常量变体。知道为什么吗?谢谢。
最佳答案
你的变量是非常量的,所以选择了函数的非常量重载。 重载解析发生后,然后检查可访问性。
当 const 和非 const 函数同时存在时,const 版本仅在 const 对象上调用。您的 foo
变量不是常量。如果需要,您可以使用 const_cast
使它成为常量:
const_cast<Foo const&>(foo).foo();
虽然使用起来很麻烦。更好的解决方案是只给内部函数一个不同的名称,这样它就不会与外部 API 发生冲突。
关于c++ - 为什么我不能访问具有 protected 重载的公共(public)函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9475934/