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

标签 c++ oop c++11 design-patterns factory

假设我有一个人类类(class):

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

以及派生类(例如Female和Male),它们实现了自己的方法。在C++ 11中,是否有一种方法可以在运行时根据Human构造函数的输入来确定Human应该是哪种“子类型”(男性或女性)?
对于男性和女性,我在各自的类里面采用了不同的行为方式。我要尝试做的是在运行时根据构造函数的输入确定Human是Female类型还是Male类型,因此我可以(之后)根据其类型应用适当的行为。
理想的做法是始终调用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);
}

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

只需记住使Human的析构函数 virtual 成为可能,因为MaleFemale类都公开继承自Human

关于c++ - 基本构造函数根据输入调用派生的构造函数-在运行时选择对象子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60037091/

相关文章:

c# - 在编程语言中扩展预增量运算符

c++ - 优化速度 : Queue of Vectors vs. vector 指针队列

java - 正确的图形引用方法?

C++ - 错误 - 没有运算符 "[]"与这些操作数匹配

c++ - CMake 找不到 boost 。

c++ - 使用 CLion 在不同文件中分离 Boost 测试套件的正确方法

c# - 如何在派生类中 DRY 静态重复样板代码?

Javascript 使用类中的变量调用类方法

c++ - 奇怪的错误 - 为什么编译器试图调用复制构造函数?

c++ - 了解 Makefile 的依赖关系 (C++)