c++ - 从 C++ 中具有多重继承的类派生的类:派生类正在尝试调用根基类构造函数
问题描述
如果这感觉像是我上一个问题的廉价续集,我很抱歉。
我有一个钻石继承,其中D
来自B
和C
,而后者又都来自(实际上)来自A
。A
,B
并且C
是抽象的,并且由于对我以前的问题的回答,编译器现在已经意识到它并且一切都很好。
现在,我需要创建一个E
从D
. 据我所知,通常构造函数E::E
应该调用D::D
,D::D
调用所有A::A
,B::B
和C::C
.
但是我的编译器真的坚持自己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 本身。
就像我在回答您之前的问题时所解释的那样:“最派生类的构造函数调用虚拟基的构造函数”。
包含虚拟基的层次结构中的所有非抽象类都必须正确初始化虚拟基,因为它们可能被实例化为最派生的类。例如,如果您创建 的实例E
,那么它就是E
初始化虚拟基的构造函数A
。
在您的代码中,构造函数E
尝试A
通过省略初始化程序来使用默认构造函数。但A
不是默认可构造的,因此程序格式错误。
我错过了什么?
A
的构造函数中虚拟基的初始化程序E
。
据我所知,没有办法将虚拟基础的构建委托给另一个具体基础,例如D
.
推荐阅读
- python - pandas 0.20:如何对具有多级索引的列进行自定义排序?
- transparency - (C++/WinRT) 缩放时如何保持位图透明度?
- python - conda-unpack 脚本在哪里?
- class - 当 QMainwindow 作为值传递给包含 QMainWindow 的其他类时,组合框不起作用
- haskell - 为什么作为值的局部变量的类型会影响函数类型签名中输入变量的类型?
- java - 为什么使用?:Java for 循环中的运算符被标记为没有语句?
- postgresql - 我在将数据插入到 postgres 表单 Visual basic.Net 时遇到问题
- automation - Selenium 4 Devtools - 无法映射结果和未知驱动程序和无法使私有 java.lang.Void() 可访问
- javascript - 如何在移动到 .forEach 之前捕获数组 .filter?
- deepstream.io - DeepStream5.1 python版本:kafka,无法打开共享库