【问题标题】:How to override abstract class constructor in sub class如何覆盖子类中的抽象类构造函数
【发布时间】:2019-04-11 09:46:41
【问题描述】:

我刚刚从 java 迁移到 c++,我真的在为曾经的基本概念而苦苦挣扎。我要做的就是创建一个名为“Spaceship”的抽象类,给它一个带有 4 个参数的构造函数,然后在一个名为“Alienspaceship”的子类中,我想创建一个带有 5 个参数但继承“spaceship”的构造函数' 构造函数的前 4 个参数。我一直在寻找所有地方,似乎无法找到我正在寻找的东西。下面是我的代码。请感谢任何可以帮助我的人!

标题

#ifndef SPACESHIP
#define SPACESHIP

#include "Enum.h"

class Spaceship{
    public:
    float health;
    float food;
    float cash;
    float misc;

public:
    Spaceship(float, float, float, float);

};

class AlienSpaceship: public Spaceship{
    OrganismType race;

    public:
        AlienSpaceship(float, float, float, float, OrganismType):Spaceship(float, float, float, float){}
};

#endif

cpp

#include "Spaceship.h"

Spaceship::Spaceship(float health, float food, float cash, float misc){
    this->health = health;
    this->food = food;
    this->cash = cash;
    this->misc = misc;
}

AlienSpaceship::AlienSpaceship(float health, float food, float cash, float misc, OrganismType race):Spaceship(health, food, cash, misc){
    this->race = race;
}

【问题讨论】:

  • AlienSpaceship(float, float, float, float, OrganismType):Spaceship(float, float, float, float){} 是一个定义!它与您的 cpp 文件中的类外定义冲突。我怀疑您在重构时犯了印刷错误。忘记更新你移动的东西了。
  • 离题:注意数据成员可以(应该?)在构造函数的主体之前初始化,你不需要这个->。因此: Spaceship::Spaceship(float health, float food, float cash, float misc): health(health), flood(flood), cash(cash), misc(misc) {}
  • 顺便说一句,您的 Spaceship 类不是抽象的。这是一个具体的类。至少使用您向我们展示的代码。
  • @Someprogrammerdude 是不是因为它不包含虚函数?
  • 一个抽象类的虚函数被“初始化”为零(例如virtual void abstract_function() = 0;)。纯抽象类只有个抽象函数(所以甚至没有构造函数或析构函数)。

标签: c++ inheritance constructor abstract


【解决方案1】:

您似乎误解了构造函数初始化列表的工作原理。

在构造函数的定义(即实现)中使用,构造函数的声明不需要它。

事实上,您当前在AlienSpaceship 类中的声明实际上定义(实现)构造函数,因为结尾{}

所以对于课程,你需要做的就是

class AlienSpaceship: public Spaceship{
    ...
    public:
        AlienSpaceship(float, float, float, float, OrganismType);
};

在相关的说明中,我建议你也使用初始化列表来初始化成员变量,那么你的构造函数可能只是

Spaceship::Spaceship(float health, float food, float cash, float misc)
    : health(health), food(food), cash(cash), misc(misc)
{ /* Empty */ }

AlienSpaceship::AlienSpaceship(float health, float food, float cash, float misc, OrganismType race)
    : Spaceship(health, food, cash, misc), race(race)
{ /* Empty */ }

当然,这可以在类定义本身中内联完成:

class AlienSpaceship: public Spaceship{
    ...
    public:
        AlienSpaceship(float health, float food, float cash, float misc, OrganismType race)
            : Spaceship(health, food, cash, misc), race(race)
        { /* Empty */ }
};

【讨论】:

    【解决方案2】:

    AlienSpaceship(float, float, float, float, OrganismType):Spaceship(float, float, float, float){}

    应该是:

    AlienSpaceship(float, float, float, float, OrganismType);

    在您的标题中。您实际上已经在标题中创建了第二个实现...

    【讨论】:

      【解决方案3】:

      每个类成员应该只有一个定义,但你有两个

      第一个(隐含在类定义中)

      public:
      AlienSpaceship(float, float, float, float, OrganismType):Spaceship(float, float, float, float)
      {}
      

      第二个是源文件

      AlienSpaceship::AlienSpaceship(float health, float food, float cash, float misc, OrganismType race):Spaceship(health, food, cash, misc)
      {
          this->race = race;
      }
      

      选择其中之一,要么放

      AlienSpaceship(float health, float food, float cash, float misc, OrganismType race):Spaceship(health, food, cash, misc)
      {
          this->race = race;
      }
      

      进入类定义

      要么在课堂上声明它

      class AlienSpaceship: public Spaceship{
      OrganismType race;
      
      public:
      AlienSpaceship(float, float, float, float, OrganismType);
      

      并在源文件中定义

      AlienSpaceship::AlienSpaceship(float health, float food, float cash, float misc, OrganismType race):Spaceship(health, food, cash, misc)
      {
          this->race = race;
      }
      

      还有,像这样声明

      AlienSpaceship(float, float, float, float, OrganismType):Spaceship(float, float, float, float)
      
      is incorrect too. Actually, it conatains a part of defenition.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-17
        • 1970-01-01
        • 2019-04-02
        • 1970-01-01
        • 2017-02-03
        • 1970-01-01
        • 2018-09-26
        • 1970-01-01
        相关资源
        最近更新 更多