【发布时间】:2019-01-13 18:45:36
【问题描述】:
这是完全有效的 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。
谁能解释一下为什么会这样?
【问题讨论】:
-
你知道你的继承是
private吗? -
@r3musn0x 我也有同样的行为,不做任何公开的更改
-
@r3musn0x 那个时候是的,这很令人不安,因为在那种情况下没有钻石
-
@bruno,据我所知,无论继承是否为菱形,派生最多的类都应该初始化虚基。
-
@r3musn0x 完全正确