首页 > 解决方案 > 虚拟继承不适用于特定的 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。

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

标签: c++g++

解决方案


你需要 :

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

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

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


推荐阅读