【发布时间】:2014-11-09 19:16:10
【问题描述】:
我在某项任务上遇到问题,这是一项练习,而不是真正的程序。任务是定义结构 D 的复制构造函数,其行为方式与编译器生成的复制构造函数完全相同。
class Ob{
};
struct A {
Ob a;
};
struct B : A {
Ob b;
};
struct C : A, B {
Ob c;
};
struct D : C, A {
Ob d;
};
如您所见,结构 A 在 D 结构中间接派生了几次,这导致复制构造函数的定义出现歧义,如下所示:
D(const D& _d) : C(_d), A(_d), d(_d.d) {}
我的问题是如何正确定义该复制构造函数?没有上面提到的定义的代码是编译的,所以看起来应该是可以的。
MinGW 4.8.1 错误信息:
zad3.cpp:12:8: warning: direct base 'A' inaccessible in 'C' due to ambiguity [enabled by default]
struct C : A, B {
^
zad3.cpp:16:8: warning: direct base 'A' inaccessible in 'D' due to ambiguity [enabled by default]
struct D : C, A {
^
zad3.cpp: In copy constructor 'D::D(const D&)':
zad3.cpp:17:38: error: 'A' is an ambiguous base of 'D'
D(const D& _d) : C(_d), A(_d), d(_d.d) {}
^
重要提示:这是NOT A DUPLICATE问题“Inaccessible direct base由多重继承引起的”,这是关于具有不同访问说明符的公共基类,最终是由转换问题引起的。在这里,它是关于消除具有相同可见性多次继承的公共基础所需的初始化程序的歧义。
【问题讨论】:
-
你能添加完整的编译器错误信息吗?
-
哦,我想明白了,yee 编译器错误。
-
@rupesh.yadav:在您尝试直接使用这些成员之前不会出错,例如
D::method() { a = A(); }或D d = D(); d.a = A();。 -
没有办法。这就是警告告诉你的。请参阅Johannes's answer,了解有关直接基础的独特之处的解释。
标签: c++ multiple-inheritance copy-constructor ambiguity ambiguous