C++中继承自公共/私有基类的同名成员访问歧义问题咨询
编译错误原因分析:多重继承下的名字查找与访问权限问题
你的编译错误核心原因是多重继承中的名字歧义,C++的名字查找规则和你预想的逻辑不一样:
- 编译器处理
c::member时,会先执行名字查找,而非先检查访问权限。它会在c的作用域中查找member,找不到就去所有直接基类(a和b)中查找。 - 结果两个基类都存在名为
member的成员——不管b的member是private还是public,只要名字存在,就会被纳入查找结果。这就导致名字冲突,编译器直接抛出歧义错误,根本不会进入后续的访问权限检查环节。
你之前误以为b的private成员会被"隐藏",但实际上C++的访问权限控制是在名字查找完成之后才生效的。只要名字在查找阶段出现多个匹配,就会直接报错,不会因为某个匹配是private就忽略它。
如果要解决这个问题,需要明确指定你要访问的是哪个基类的成员,比如改成:
std::cout << c::a::member << std::endl;
内容的提问来源于stack exchange,提问作者Pingas
相关产品推荐
相关产品推荐

