基本构造函数根据输入调用派生构造函数 - 在运行时选择对象子类型
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
对象。
据我了解,您想根据在 运行 时获得的性别输入创建 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);
}
它在 运行 时根据传递给 isFemale
参数的参数决定是创建 Female
还是 Male
对象。
只记得创建Human
的析构函数virtual
因为Male
和Female
类 公开继承自Human
。
请注意,您的设计允许 Male
和 isFemale = "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。
假设我有一个人类 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
对象。
据我了解,您想根据在 运行 时获得的性别输入创建 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);
}
它在 运行 时根据传递给 isFemale
参数的参数决定是创建 Female
还是 Male
对象。
只记得创建Human
的析构函数virtual
因为Male
和Female
类 公开继承自Human
。
请注意,您的设计允许 Male
和 isFemale = "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。