派生自具有多重继承的类的类 C++:派生类正在尝试调用根基类构造函数



如果这感觉像是我最后一个问题的廉价续集,我很抱歉。

我有一个钻石遗产,其中D来自BC,而又都(实际上)来自AABC是抽象的,由于我之前问题的答案,编译器现在意识到了这一点,一切都很好。

现在,我需要创建一个派生自D的类E。据我所知,通常构造函数E::E应该调用D::D,而调用所有A::AB::BC::CD::D的工作。

但我的编译器真的坚持E::E调用A::A本身。

这是我做的一个简单的例子:

class A {                       //abstract
protected:
A(int foo) {}
virtual void f() =0;
};
class B: public virtual A {     // abstract
protected:
B() {}
};
class C: public virtual A {     // abstract
protected:
C() {}
};
class D: public B, public C {   // concrete
public:
D(int foo, int bar) :A(foo) {}
void f() {}
};
class E: public D {             // concrete
public:
E(int foo, int bar, int buz) :D(foo, bar) {}
};

int main()
{
return 0;
}

这是编译错误:

$ g++ test.cpp
test.cpp: In constructor ‘E::E(int, int, int)’:
test.cpp:25:49: error: no matching function for call to ‘A::A()’
25 |         E(int foo, int bar, int buz) :D(foo, bar) {}
|                                                 ^
test.cpp:3:9: note: candidate: ‘A::A(int)’
3 |         A(int foo) {}
|         ^
test.cpp:3:9: note:   candidate expects 1 argument, 0 provided
test.cpp:1:7: note: candidate: ‘constexpr A::A(const A&)’
1 | class A {                       //abstract
|       ^
test.cpp:1:7: note:   candidate expects 1 argument, 0 provided
test.cpp:1:7: note: candidate: ‘constexpr A::A(A&&)’
test.cpp:1:7: note:   candidate expects 1 argument, 0 provided

我知道虚拟继承是正确的,我知道编译器知道我打算抽象哪些类,哪些类是可实例化的,因为如果我删除class E,代码就会编译。

我错过了什么?

但我的编译器真的坚持让 E::E 调用 A::A 本身。

就像我在 anwer 中解释的你之前的问题:">派生最多类的构造函数调用虚拟基的构造函数"。

包含虚基的层次结构中的所有非抽象类都必须正确初始化虚拟基,因为它们有可能被实例化为派生最多的类。例如,如果创建E的实例,则初始化虚拟基A的是E的构造函数。

在代码中,E的构造函数尝试通过省略初始化器来使用A的默认构造函数。但是A不是默认可构造的,因此程序格式不正确。

我错过了什么?

虚拟基的初始化器AE的构造函数中。

据我所知,没有办法将虚拟基地的建设委托给另一个具体基地,例如D

最新更新