这是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。
有人可以解释一下为什么会这样吗?
答案 0 :(得分:0)
您需要:
class C : public B {
public:
C(int a) : A(a), B(a) {} // in that order
};
正如r3mus n0x所说,无论继承是否为菱形,最派生的类都应初始化虚拟基。
道德:如果您没有钻石,请不要使用虚拟继承