虚拟继承而不显式初始化父类

时间:2014-08-10 05:02:54

标签: c++ inheritance

我有两类机器和人类,几乎从原子继承。现在我写了一个名为“Cyborg”的类,并希望从Cyborg初始化Atom。代码是

#include <iostream>

using namespace std;

class Atom {
public:
  Atom(size_t t): transformium(t) {};
private:
  const size_t transformium;
};

class Human : public virtual Atom {
public:
  Human(string name) : Atom(-1), name(name) {}
protected:
  string name;
};

class Machine : public virtual Atom {
public:
  Machine() {}
  Machine(int id) : id(id) {}
protected:
  int id;
};

class Cyborg : public Human, public Machine {
public:
  Cyborg(string name, int id) : Atom(0), Human(name) {}
};

int main() {
  Cyborg cyborg("robocup", 911);
  return 0;
}

但是,CXX编译器要求Machine初始化Atom,因为const成员“transformium”。

error: constructor for 'Machine' must explicitly initialize the base class 'Atom' which does not have a default constructor

1 个答案:

答案 0 :(得分:3)

正如编译器错误所示,您必须在Atom的构造函数中显式初始化基类Machine

原因是您可以创建Machine的实例。对于这样的对象,必须有一种方法来正确初始化Atom的{​​{1}}部分。

<强>更新

Machine的初始化方式会有所不同,具体取决于您是创建AtomHuman还是Machine的实例。这是您的代码的更新版本,其中包含一些解释。

Cyborg

输出:

Came to Atom::Atom()
------------------
Came to Atom::Atom()
------------------
Came to Atom::Atom()