代码之家  ›  专栏  ›  技术社区  ›  nivalen292

C++创建两个独立抽象类的派生类数组

  •  1
  • nivalen292  · 技术社区  · 7 年前

    这可能是个愚蠢的问题,但我还是不得不问。我有两个独立的抽象类: 性格 敌人 . 野蛮人 亡灵巫师 派生自 性格 , 骨骼 魔王 派生自 敌人 我的问题是,我能创建一系列这两者的派生吗 性格 敌人 .我可以创建另一个类吗 实体 这样地:

    class Entity : public Character, public Enemy {};
    

    然后我会创建一个指向 敌人 .

    那么我能不能这样做:

    Entity* p = new Barbarian;
    

    如果可能的话,我想我需要一个虚拟析构函数。我该如何定义这一点?

    编辑:我犯了一个愚蠢的错误,继承应该是另一种方式,问题是它可以这样做吗?

    3 回复  |  直到 7 年前
        1
  •  6
  •   MPops    7 年前

    相反。您应该创建实体抽象类。角色和敌人应该继承实体类。

    class Character : public Entity
    
    class Enemy : public Entity
    

    你提到的其他一切都很好。您需要创建实体类的数组,对于每个实体,您可以说 ent = new Barbarian() 或者类似的。

        2
  •  3
  •   Stephan Lechner    7 年前

    不,你不能那样做。具有

    class Entity : public Character, public Enemy {}
    

    Entity 永远都是 Character Enemy 同时,它不能是一个(或多个)子类,如 Barbarian .

    所以 Entity* p = new Barbarian; 行不通。

    要实现您的目标,请介绍 实体 作为 性格 敌人 :

    class Entity {};
    class Character : public Entity {};
    class Barbarian : public Character {};
    ...
    class Enemy : public Entity {};
    ...
    std::vector<Entity*> e;
    Barbarian *b = new Barbarian();
    e.push_back(b);
    
        3
  •  2
  •   bipll    7 年前

    最简单的方法可能是反向操作:

    struct Entity {
        virtual ~Entity = default;
    };
    struct Enemy: Entity {};
    struct Character: Entity {};
    

    那么,将指针指向任何生物都不会有问题 Entity * .