关于warning: direct base 'A' inaccessible in 'D' due to ambiguity的一些讨论

c++ primer习题中发现的问题,习题是18.13。

这个问题很久前有过讨论,不过没有得出正确结论,原贴。

先上代码:

struct A {
	virtual ~A() {}
};

struct B : A {};

struct C : B {};

struct D : B, A {};

继承层次很清楚,就是照着书上抄的,没写实例化。使用如下编译命令:
g++ -o test -Wall test.cpp
得到如下警告:
warning: direct base 'A' inaccessible in 'D' due to ambiguity

gdb调试发现D中两个独立的A被正确构造。很奇怪一般二义性不会在定义类的时候被警告,想了下,发现原因其实很简单。

在D中的两个A的完整访问应该是D::B::A和D::A,但问题是D::A同样可以指向D::B::A,因为这个过程发生的是名字查找,每条路径都由内而外遵循名字查找规则,而每条路径都非虚或都虚的情况下,路径长短不作为区别优先的根据。所以无论如何第二个A实例都无法被访问。

之所以会遇到这个问题是因为我从java转c++,写全名写惯了,囧。

原贴中提到了另一个问题,我想这应该是很多人的第一反应:“是不是编译器要求虚继承呢?”继承层次改为:

struct A {
	virtual ~A() {}
};

struct B : A {};

struct C : B {};

struct D : B, virtual A {};

或者:
struct A {
	virtual ~A() {}
};

struct B : virtual A {};

struct C : B {};

struct D : B, A {};

可不可以呢?这时候奇葩的事情就发生了,见 原贴14楼,这应该是可以的,理由见c++ primer 17.3.6.2的第二款,虚继承优先级低于派生实例。但是我的g++ 4.7.2在实例化访问时报error:ambiguity。这个我就没法解释了。反正这种继承层次就是不合理的,避免就好。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值