以下代码无法编译,说"错误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;
}
Run Code Online (Sandbox Code Playgroud)
APr*_*mer 15
其他答案中没有提到的部分问题是可访问性和可见性是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用来添加 constness:
const B& b = const_cast<const A&>(a).getMe();
Run Code Online (Sandbox Code Playgroud)
当然,虽然这很奇怪也很有趣,但如果你这样做可能会更容易阅读:
const A& const_a = a;
const B& b = const_a.getMe();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1321 次 |
| 最近记录: |