Инициализация члена в унаследованном классе с другим значением базового класса - PullRequest
0 голосов
/ 20 апреля 2020

Допустим, у меня есть класс Entity с переменной x, и он определен как 0 в этом классе.

Ну, тогда я создаю производный класс Player, но я хочу, чтобы Player по умолчанию наследовал x как 1, а не 0, так что каждый Player, который я создаю x будет 1 по умолчанию.

Возможно ли это?

А если это так, как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

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

Классы Пример 1

class Entity{
private:
    int x;
public:
    Entity(int i = 0) : x(i) {} //initialize x to 0
    int getX() {return x;}
};

class Player: public Entity{
public:
    Player() : Entity(1) {}   //inherit base class constructor initializing x to 1
};

Эта реализация имеет потенциальную слабость, она позволяет создавать объекты, инициализирующие x. Если вы не хотите этого, вы можете иметь защищенный конструктор, который позволяет производным классам указывать значение члена, предотвращая создание объектов, которые могут инициализировать x.

Классы Пример 2

class Entity {    
    int x = 0;    
public:
    Entity() = default; //default construtor
    int getX(){return x;}

protected:
    Entity(int i) : x(i) {} //protected constructor, 
};

class Player : public Entity {
public:
    Player() : Entity(1) {}
};

Использование

#include <iostream>

using std::cout;
using std::endl;

int main()
{   
    Entity e;
    cout << e.getX() << endl;

    Player p;
    cout << p.getX();

    return 0;
}

В зависимости от сложности ваших классов вы также можете сделать защищенного строителя явным

Вывод

0
1

Обратите внимание, что это очень упрощенная версия, вы должны соблюдать правила построения классов, например, Правило трех /five/zero.

1 голос
/ 20 апреля 2020
class Entity {
  private:
    int x;
  public:
    Entity() : x(0)
  {}
    void set_x(int y){
      x = y;
    }
    int get_x(){
      return x;
    }

};

class Player : public Entity {
  public:
    Player() 
    {
      set_x(1);
    }
};
...