C ++ Создание массива производных классов из двух отдельных абстрактных классов - PullRequest
0 голосов
/ 17 мая 2018

Это может быть глупый вопрос, но я все равно должен был его задать.У меня есть 2 отдельных абстрактных класса: Персонаж и Враг . Варвар и Некромант получены от Персонаж , Скелет и Дьявол получены от Враг. Мой вопрос: могу ли я создать массив производных как Персонажа , так и Врага .Могу ли я создать другой класс, скажем, Сущность , например:

class Entity : public Character, public Enemy {};

Тогда я бы создал массив указателей на Enemy .

CanЯ делаю это как-то тогда:

Entity* p = new Barbarian;

Также, если это возможно, я предполагаю, что мне нужен виртуальный деструктор.Как я могу определить это?

РЕДАКТИРОВАТЬ: глупая моя ошибка, наследство должно быть наоборот, и вопрос в том, можно ли это сделать так?

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Это наоборот.Вы должны создать абстрактный класс Entity.Персонаж и враг должны наследовать класс сущности.

class Character : public Entity

class Enemy : public Entity

Все остальное, что вы упомянули, в порядке.Вам нужно будет создать массив класса Entity, и для каждой сущности вы можете сказать ent = new Barbarian() или что-то в этом роде.

0 голосов
/ 17 мая 2018

Нет, вы не можете сделать это таким образом.С

class Entity : public Character, public Enemy {}

Entity всегда будет одновременно Character и Enemy, но это не может быть один (или более) из подклассов, таких как Barbarian.

То есть Entity* p = new Barbarian; не будет работать.

Чтобы достичь того, что вы хотите, введите Entity в качестве общего базового класса для Character и Enemy:

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);
0 голосов
/ 17 мая 2018

Самый простой способ, вероятно, сделать это в обратном порядке:

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

Тогда не будет проблем с наведением указателя на любое существо на Entity *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...