c++ - 为什么我不能访问具有 protected 重载的公共(public)函数?

标签 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' : 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/

相关文章:

c++ - 为什么函数参数中的 const 限定符用于重载解析?

java - 理解Java的protected修饰符

c++ - C++ 编译器是否优化掉未使用的#includes?

c++ - opencv:两个3D点云之间的刚性转换

c++ - 如何在编译时选择正确的重载函数模板?

C++:是否可以重载 |位于同一类中的两个不同枚举的运算符?

java - 如何保护类,使其在包外不可见

java - 为什么 protected 变量在类级别可见?

c++ - 如何检查 QImage::save() 是否已完成写入磁盘?

c++ - 在 C++ 中,将 int 拆分为位的正确术语是什么