【问题标题】:virtual inheritance doesn't work on specific g++ version [duplicate]虚拟继承不适用于特定的g ++版本[重复]
【发布时间】: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 完全正确

标签: c++ g++


【解决方案1】:

你需要:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 2015-11-21
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多