Базовый конструктор вызывает производный конструктор в зависимости от ввода - выберите подтип объекта во время выполнения - PullRequest
1 голос
/ 03 февраля 2020

Допустим, у меня есть класс Human:

class Human {
public:
    bool isFemale;
    double height;
    Human(bool isFemale, double height) {
        this->isFemale = isFemale;
        this->height = height;
    }
};

и производные классы, такие как Female и Male, которые реализуют свои собственные методы. У меня есть способ, в C ++ 11, чтобы определить во время выполнения, в зависимости от входных данных в конструктор человека, какой "подтип" (мужской или женский) человек должен быть? Я выставляю разное поведение для Мужчин и Женщин в их соответствующих классах. То, что я пытаюсь сделать, это определить во время выполнения, является ли тип Human типом Male или типом Male, в зависимости от входных данных конструктора, поэтому я могу (впоследствии) применять соответствующее поведение в зависимости от его типа. Идеальным было бы всегда вызывать конструктор Human и соответствующий подтип, который будет выбран во время выполнения, в зависимости от параметров, вводимых в конструктор. Если это возможно, я думаю, что нужно повернуть конструктор "Человек", но я не уверен, как ...

Ответы [ 2 ]

5 голосов
/ 03 февраля 2020

Вызвав конструктор Human, вы можете создать только объект Human.

Насколько я понимаю, вы хотите создать объект Male или Female в зависимости от гендерный вклад, который вы получаете во время выполнения. Тогда вам, вероятно, следует рассмотреть фабричную функцию для достижения этого.

Например, если вы определите Male и Female как:

struct Male: public Human {
   Male(double height): Human(false, height) {}
   // ...
};

struct Female: public Human {
   Female(double height): Human(true, height) {}
   // ...
};

Тогда Вы можете использовать следующую фабричную функцию, make_human():

std::unique_ptr<Human> make_human(bool isFemale, double height) { 
   if (isFemale)
      return std::make_unique<Female>(height);
   return std::make_unique<Male>(height);
}

. Во время выполнения она решает, создавать ли объект Female или Male на основе аргумента, переданного isFemale. параметр.

Просто не забудьте сделать деструктор Human virtual, потому что Male и Female классы публично наследуются от Human.

2 голосов
/ 03 февраля 2020

Обратите внимание, что ваш дизайн допускает Male с isFemale = true", вы можете делегировать это действие внутренне, избегая ошибочных флагов, для целей примера вы можете сделать что-то вроде этого: Live Sample

class Human {
    private:
      int height;
    protected:
      bool isFemale;
    public:
      Human(){};
      Human(int height){
        this->height = height;
      }
      virtual ~Human(){};
};

class Female : public Human{ 
    public:
      Female(int height) : Human(height){
        isFemale = true;
    }

};

class Male : public Human{
    public:
      Male(int height) : Human(height) {
         isFemale = false;
      }
};

Вы можете вызвать соответствующий конструктор:

Human h = Male();
Human h = Female();
...