虚拟继承不适用于特定的g ++版本

时间:2019-01-13 18:45:36

标签: 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。

有人可以解释一下为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

您需要:

class C : public B {
public:
   C(int a) : A(a), B(a) {} // in that order
};

正如r3mus n0x所说,无论继承是否为菱形,最派生的类都应初始化虚拟基。

道德:如果您没有钻石,请不要使用虚拟继承

相关问题