繁体   English   中英

Const重载:C ++类中的公共私有查找

[英]Const Overloading: Public-Private Lookup in C++ Class

以下代码无法编译,说“错误C2248:'A :: getMe':无法访问类'A'中声明的私有成员”。 为什么? 我试图调用公共接口。

class B
{
};

class A
{
public:
    const B& getMe() const;
private:
    B& getMe(); 
};

int main()
{
A a;
const B& b = a.getMe();
return 0;
}

其他答案中没有提到的部分问题是可访问性和可见性是C ++中的独立概念。 B& A::getMe()私有成员在main可见,即使它不可访问。 所以在你的调用a.getMe()有两个需要考虑的重载成员, B& A::getMe()B const& A::getMe() const 作为a不是const它是被选中的私有成员。 然后您会收到错误,因为它无法访问。 如果您没有私有非const成员函数,那么您将使用const成员作为唯一的可能性,并且可以调用它作为const成员可以在非const对象上调用。

请注意,如果可见性取决于可访问性,则可能存在其他类型的混淆行为:您重构成员,将调用发送到类外的私有成员。 现在,私人会员不再可访问,因此呼叫是公共的不同成员。 行为的无声改变可能导致难以追踪的错误。

总而言之:无论你的语言是什么规则,永远不会过载不同的可访问性,它会导致混乱。

在C ++中,您不能在返回类型上重载。 基于const的重载成员函数也不例外:重载调用函数的对象的constness,而不是返回类型。

做你想要的是一个千载难逢的机会,使用const_cast增加 const_cast

const B& b = const_cast<const A&>(a).getMe();

当然,虽然这很奇怪也很有趣,但如果你这样做可能会更容易阅读:

const A& const_a = a;
const B& b = const_a.getMe();

a在a.getMe()中不是const,因此编译器没有意识到你正在尝试使用方法的const重载。

A const a;
const B& b = a.getMe();

将按预期工作(除了A需要初始化)。

这是因为通过非const方法调用const方法,应该是const以防止编译器选择非const方法。

调用私有memeber函数是否更容易,以避免混淆具有相同名称但具有不同访问权限的两个函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM