c++ - 虚拟继承不适用于特定的 g++ 版本
问题描述
这是 C++ 中完全有效的代码
class A {
public:
A(int a) {}
};
class B : A {
public:
B(int a) : A(a) {}
};
class C : B {
C(int a) : B(a) {}
};
但是,当我将 B 类的继承更改为虚拟时:
class B : virtual A {
public:
B(int a) : A(a) {}
};
我明白了
$ g++ som.h
som.h: In constructor ‘C::C(int)’:
som.h:14:16: error: no matching function for call to ‘A::A()’
C(int a) : B(a) {}
^
最奇怪的是在我朋友的 PC 上编译(她有 g++ 7.3 版本和 ubuntu 18)。我有 g++ 5.5 和 ubuntu 16。
有人可以解释一下为什么会这样吗?
解决方案
你需要 :
class C : public B {
public:
C(int a) : A(a), B(a) {} // in that order
};
正如 r3mus n0x 在备注中所说,无论继承是否为菱形,最派生类都应初始化虚拟基。
道德:如果您没有钻石,请不要使用虚拟继承
推荐阅读
- macros - Lisp 的宏系统也可以扩展它的注释语法吗?
- javascript - 我有一个 js 脚本,它应该禁用一个按钮,但它不起作用
- powerbi - 在 Power BI 中仅使用开始日期和结束日期计算每月平均值
- android - 将原始音频从 Android 流式传输到服务器再到客户端
- java - 颤动中的Firebase通知 - 编译错误
- node.js - 更新 Firestore 中的嵌套变量字段
- python - Python - 中断语句在while循环中的else语句中不起作用
- python - 将元素添加到链表python
- r - 如果第一个返回 NA,告诉 left_join() 使用另一列?
- reactjs - 访问 activeIndex