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

use*_*703 3 c++ inheritance constructor

我有以下类层次结构:

 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) 
 }
Run Code Online (Sandbox Code Playgroud)

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

有没有什么方法/模式/设计可以避免像这样重写所有内容?

小智 5

当涉及到严格的 OOP 时,通常通过将参数封装在结构体中来处理此类问题:

\n
struct HumanData {\n    int pAge, \n    bool pSex,\n    double pSize,\n    double pPower,\n    bool pFly,\n    bool pHeal\n}\n
Run Code Online (Sandbox Code Playgroud)\n

或者,您可以构建一个在超人类基础上创建超人类的结构。

\n

只是一个提示,正如我看到的,你正在尝试一些游戏开发。\n通常将属性包装在结构中,“回报很大”。\n所以让你的 SEX 成为基于布尔的枚举(我知道,有点矫枉过正: ))。您可以在此处阅读有关 C++0x 中的基于类枚举的信息: https: //smartbear.com/blog/closer-to-perfection-get-to-know-c11-scoped-and-ba/ ?feed=develop

\n

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

\n

附带说明:您绝对确定需要使您的类层次结构如此陡峭吗?正如 Stroustrup 所说,“Don\xe2\x80\x99t 立即为你的所有类发明一个独特的基础。通常,对于许多/大多数类,如果没有它,你可以做得更好。” - 这是相当准确的。

\n

C++ 不是 C#/Java - 强迫它如此,只会使它变得反叛。

\n