没有默认构造函数的多重继承菱形问题



我最终遇到了一个多重继承菱形问题,即基类中没有默认构造函数。

struct A {
A(int x) {}
};
struct B : virtual public A {
using A::A;
};
struct C : virtual public A {
using A::A;
};
struct D : virtual public B, public C {
D(int x) : B(x), C(x) {}
};
int main() {
D d(1);
}

编译器抱怨:

error: constructor for 'D' must explicitly initialize the base
class 'A' which does not have a default constructor
D(int x) : B(x), C(x) {}

但是,我实际上无法从D访问A。。。我该怎么解决?感谢

您确实可以访问A,因为您继承了它。

您必须调用A的构造函数才能构造对象D。您的D构造函数应该是这样的:D(int x) : A(x), B(x), C(x) {}由于多重继承,BC的构造函数将忽略A(x)部分,并且您将只有一个对象,即D

最新更新