无需显式初始化父类的虚拟继承

斯特林

我有两种机器和人类,它们实际上是从原子继承的。现在,我编写了一个名为“ 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;
}

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

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

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

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

更新资料

Atom被初始化的不同,这取决于你是否创建一个实例HumanMachineCyborg这是您代码的更新版本,并附带了一些解释。

#include <iostream>

using namespace std;

class Atom {
   public:
      Atom(size_t t): transformium(t) { std::cout << "Came to Atom::Atom()\n"; }
   private:
      const size_t transformium;
};

class Human : public virtual Atom {
   public:
      Human(string name) : Atom(-1), name(name) {}
      // Atom(-1) is ignored when an instance of Cyborg is created
      // but not when an instance of Human is created.
   protected:
      string name;
};

class Machine : public virtual Atom {
   public:
      Machine(int id) : id(id), Atom(-1) {}
      // Atom(-1) is ignored when an instance of Cyborg is created
      // but not when an instance of Machine is created.
   protected:
      int id;
};

class Cyborg : public Human, public Machine {
   public:
      Cyborg(string name, int id) : Atom(0), Human(name), Machine(id) {}
      // Atom needs to be intialized here since it won't be initialized 
      // in either Human or Machine.
};

int main() {
   Cyborg cyborg("robocup", 911); // Calls Atom::Atom() only once.
   std::cout << "------------------\n";
   Human human("robocup");        // Calls Atom::Atom() once.
   std::cout << "------------------\n";
   Machine machine(911);          // Calls Atom::Atom() once.
   return 0;
}

输出:

来到Atom :: Atom()
------------------
来到Atom :: Atom()
------------------
来到Atom :: Atom()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

继承时需要初始化父类吗?

来自分类Dev

嵌套继承问题-如何初始化父类?

来自分类Dev

继承时需要初始化父类吗?

来自分类Dev

显式和非显式C#类初始化程序的区别

来自分类Dev

显式声明期间的初始化

来自分类Dev

条件字典显式初始化

来自分类Dev

GO显式数组初始化

来自分类Dev

条件字典显式初始化

来自分类Dev

Python类继承初始化

来自分类Dev

C ++ 11:带“ = {}”的类内初始化不适用于显式构造函数

来自分类Dev

类组合构造函数d必须显式初始化引用成员

来自分类Dev

C ++:显式vs隐式默认初始化

来自分类Dev

如何聚合初始化从虚拟类型继承的结构?

来自分类Dev

隐式初始化静态类

来自分类Dev

无法为数组指定显式初始化程序

来自分类Dev

是否需要显式初始化属性?

来自分类Dev

无法为数组指定显式初始化程序

来自分类Dev

无法为数组指定显式初始化程序

来自分类Dev

在 Typescipt 中为枚举设置显式初始化

来自分类Dev

Python-继承一个已初始化的类而无需调用超级构造函数

来自分类Dev

为什么使用声明的继承构造函数不使用默认构造函数初始化虚拟基类?

来自分类Dev

虚拟类抽象类的初始化

来自分类Dev

Rubocop:即使父类没有初始化,也要调用父类来初始化父类的状态

来自分类Dev

使用派生类成员初始化父类

来自分类Dev

为什么python中的继承要求父类显式继承对象?

来自分类Dev

初始化在模板化父类中定义的结构

来自分类Dev

C#类无需初始化(或调用)即可工作

来自分类Dev

带有类继承的未初始化常量错误

来自分类Dev

从泛型类继承初始化程序