You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多重继承下的名称隐藏:IBM文档与编译结果矛盾?

C++多重继承中名称隐藏的歧义问题

看到某文档称,以下代码里的赋值语句x = 0不存在歧义,理由是B::x的声明隐藏了A::x:

struct A {
   int x;
};

struct B: A {
   int x;
};

struct C: A, B {
   void f() { x = 0; }
};

int main() {
   C i;
   i.f();
}

但实际将这段代码编译时,却因歧义无法通过编译。请问该文档的说法是否正确?


结论

该文档的说法错误,这段代码确实存在歧义,具体原因如下:

  • 在C::f()中直接使用x属于非限定名称查找,编译器会先在C自身作用域查找,找不到则遍历所有直接基类(A和B)的作用域。
  • B中的x确实隐藏了B继承的A::x,但C同时直接继承了A,A::x在C的作用域中是独立可见的;而B::x作为B的成员,在C的作用域中也可见。
  • 此时两个直接基类中都存在名为x的成员,编译器无法确定要引用哪一个,因此会报歧义错误。

要消除歧义,必须显式限定要访问的成员,比如写成A::x = 0或者B::x = 0。


内容的提问来源于stack exchange,提问作者xiaokaoy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 02:24:52