基本构造函数根据输入调用派生构造函数 - 在运行时选择对象子类型

Base constructor calls derived constructor depending on input - Choose object sub-type at runtime

假设我有一个人类 class:

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

和派生的 classes,例如 Female 和 Male,它们实现自己的方法。在 C++11 中,我是否有办法根据 Human 构造函数的输入在运行时确定 "sub-type"(男性或女性)Human 应该是哪个? 我在男性和女性各自的 classes 中设置了不同的行为。我想做的是在运行时确定 Human 是 Female 类型还是 Male 类型,具体取决于构造函数输入,因此我可以(之后)根据其类型应用适当的行为。 理想的情况是始终调用 Human 构造函数,并根据在构造函数中输入的参数在运行时选择适当的子类型。如果可能的话,我想应该扭曲 "Human" 构造函数,但我不确定如何...

通过调用Human的构造函数,只能创建一个Human对象。

据我了解,您想根据在 运行 时获得的性别输入创建 MaleFemale 对象。然后,您可能应该考虑使用 工厂函数 来实现这一点。

例如,如果您将 MaleFemale 定义为:

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);
}

它在 运行 时根据传递给 isFemale 参数的参数决定是创建 Female 还是 Male 对象。

只记得创建Human的析构函数virtual因为MaleFemale公开继承自Human

请注意,您的设计允许 MaleisFemale = "true",您可以在内部委派此操作以避免错误标志,出于示例目的,您可以这样做:Live Sample

#include <iostream>

class Human {
private:
    int height;

protected:
    bool isFemale;

public:
    Human(){};
    Human(int height, bool isFemale = false) : height(height) {}
    virtual ~Human(){}
};

class Female : public Human {
public:
    Female(int height) : Human(height, true) {
        std::cout << "I'm a new Female, my height is " << height << std::endl;
    }
};

class Male : public Human {
public:
    Male(int height) : Human(height, false) {
        std::cout << "I'm a new Male, my height is " << height << std::endl;
    }
};

您可以调用适当的构造函数,例如:

int main() {

    char gender;
    Human h;

    std::cout << " enter m/f: ";
    std::cin >> gender;

    switch(gender){
        case 'm':
        case 'M':
          h = Male(186);
            break;
        case 'f':
        case 'F':  
          h = Female(175);
          break;
    }
}

如果您想利用多态性,请查看 this thread