如何避免在C ++中的派生类中重复基类构造函数参数?

用户名

我有下面的类层次结构:

 class Human {
  void foo()=0; //abstract
  int age;
  bool sex;
  double size;
  Human(int pAge,bool pSex,double pSize) : age(pAge), sex(pSex), size(pSize)     
}

class MetaHuman : Human { //abstract
 double power;
 bool fly;
 bool heal;
 MetaHuman(int pAge,bool pSex,double pSize,double pPower,bool pFly,bool pHeal) : Human(...), power(pPower),fly(pFly),heal(pHeal) }

 class SuperHuman : MetaHuman {
  void foo() const {}; //non abstract
  bool xray;
  bool inspace;
  double teleportation;
  SuperHuman(int pAge,bool pSex,double pSize,double pPower,bool pFly,bool pHeal,bool pXray,bool pInspace,double pTeleportation) : 
  MetaHuman(...),xray(pXray),inspace(pInspace),teleportation(pTeleportation) 
 }

如您所见,我只是在每个派生类中向下重复基类构造函数的所有参数,并相对于派生类添加几个参数。

有什么方法/图案/设计可以避免必须重写所有内容?

柔术

对于严格的OOP,通常通过将参数封装在struct中来处理此类问题:

struct HumanData {
    int pAge, 
    bool pSex,
    double pSize,
    double pPower,
    bool pFly,
    bool pHeal
}

或者,您可以构造以在MetaHuman基础上创建SuperHuman。

提示,正如我所见,您正在尝试一些游戏开发人员。通常将属性包装在结构中,“会收获很多”。因此,让您的性别成为基于布尔的枚举(我知道,有点过分杀人了:))。您可以在此处阅读有关C ++ 0x中的基类枚举的信息:http : //blog.smartbear.com/c-plus-plus/closer-to-perfection-get-to-know-c11-scoped-and-based-枚举类型/

您将获得超强类型的类数据,几乎不会影响性能。

附带说明:您是否绝对确定需要使您的类层次结构如此陡峭?正如Stroustrup所说:“不要立即为您所有的班级发明一个独特的基础。通常,如果没有很多/大多数班级,您可以做得更好。” -非常准确。

C ++不是C#/ Java-强制如此,只会使其反叛。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Scala中从派生类辅助构造函数调用辅助基类构造函数?

来自分类Dev

如何在Scala中从派生类辅助构造函数调用辅助基类构造函数?

来自分类Dev

在派生类 C++ 的构造函数中调用基类的构造函数

来自分类Dev

C#-在派生类中调用基类和类构造函数

来自分类Dev

如何在C ++中从基类构造函数调用派生类方法?

来自分类Dev

如何使用基类的数据成员作为派生类的构造函数?(在 C++ 中)

来自分类Dev

如何在模板派生类中调用模板基类的构造函数?

来自分类Dev

为C ++中的基类和派生类声明“虚拟”构造函数?

来自分类Dev

C ++基类构造函数,将派生类作为参数(?)

来自分类Dev

当派生类添加了数据成员时,派生类的构造函数应该如何像c ++中那样

来自分类Dev

如何从C ++中的基类访问派生类的属性?

来自分类Dev

在C ++继承中,派生类如何禁用基类的某些元素(数据或函数)?

来自分类Dev

如何在Python中将关键字参数添加到派生类的构造函数中?

来自分类Dev

为什么派生类的构造函数只能在C ++的类中定义?

来自分类Dev

C ++派生类构造函数调用基类构造函数错误

来自分类Dev

如何调用在C ++中具有抽象基类和派生类的定义的基类的虚函数定义?

来自分类Dev

如何使用派生类中的虚函数,在另一个带有基类参数的类中声明?

来自分类Dev

如何从派生类中获取基类实例

来自分类Dev

无法在C ++的派生类中重载基类方法

来自分类Dev

我如何在基类中为派生类函数做朋友?

来自分类Dev

派生类的C ++ CRTP构造函数

来自分类Dev

C ++-派生类构造函数的行为

来自分类Dev

我是否必须为C ++中的派生类编写相同的构造函数?

来自分类Dev

如何在基类构造函数中使用派生类成员

来自分类Dev

C++ 可以根据给单个构造函数的参数创建派生类而不是bass 类吗?

来自分类Dev

在C ++继承中,当指向基类的指针对象指向派生类时,不调用派生类析构函数

来自分类Dev

如何将派生类作为函数参数传递:如果派生类成员不在父类中怎么办

来自分类Dev

返回派生类型的基类中的C#方法

来自分类Dev

在C ++中初始化派生类参数

Related 相关文章

  1. 1

    如何在Scala中从派生类辅助构造函数调用辅助基类构造函数?

  2. 2

    如何在Scala中从派生类辅助构造函数调用辅助基类构造函数?

  3. 3

    在派生类 C++ 的构造函数中调用基类的构造函数

  4. 4

    C#-在派生类中调用基类和类构造函数

  5. 5

    如何在C ++中从基类构造函数调用派生类方法?

  6. 6

    如何使用基类的数据成员作为派生类的构造函数?(在 C++ 中)

  7. 7

    如何在模板派生类中调用模板基类的构造函数?

  8. 8

    为C ++中的基类和派生类声明“虚拟”构造函数?

  9. 9

    C ++基类构造函数,将派生类作为参数(?)

  10. 10

    当派生类添加了数据成员时,派生类的构造函数应该如何像c ++中那样

  11. 11

    如何从C ++中的基类访问派生类的属性?

  12. 12

    在C ++继承中,派生类如何禁用基类的某些元素(数据或函数)?

  13. 13

    如何在Python中将关键字参数添加到派生类的构造函数中?

  14. 14

    为什么派生类的构造函数只能在C ++的类中定义?

  15. 15

    C ++派生类构造函数调用基类构造函数错误

  16. 16

    如何调用在C ++中具有抽象基类和派生类的定义的基类的虚函数定义?

  17. 17

    如何使用派生类中的虚函数,在另一个带有基类参数的类中声明?

  18. 18

    如何从派生类中获取基类实例

  19. 19

    无法在C ++的派生类中重载基类方法

  20. 20

    我如何在基类中为派生类函数做朋友?

  21. 21

    派生类的C ++ CRTP构造函数

  22. 22

    C ++-派生类构造函数的行为

  23. 23

    我是否必须为C ++中的派生类编写相同的构造函数?

  24. 24

    如何在基类构造函数中使用派生类成员

  25. 25

    C++ 可以根据给单个构造函数的参数创建派生类而不是bass 类吗?

  26. 26

    在C ++继承中,当指向基类的指针对象指向派生类时,不调用派生类析构函数

  27. 27

    如何将派生类作为函数参数传递:如果派生类成员不在父类中怎么办

  28. 28

    返回派生类型的基类中的C#方法

  29. 29

    在C ++中初始化派生类参数

热门标签

归档