C++是否可以创建依赖于单个构造函数参数的派生类而不是bass类

C++ can I create derived instead of bass class dependent on arguments given to single constructor?

本文关键字:派生 bass 参数 构造函数 是否 创建 单个 依赖于 C++      更新时间:2023-10-16

如果我有一个带有派生类的基类,是否可以根据传递到单个构造函数的参数将实例创建为bass或派生类?

示例代码:

//Base Class
class MyClass {
public:
//All instances created with this constructor
MyClass(int param1, int param2) {
if (param1 > param2) { //(for example)
// TODO - create this object as SubClass instead
} else {
//normal base class construction
}
}
}
//Derived Class
class SubClass {
public:
SubClass(int param1, int param2) {
//Subclass construction
}
void function() {
//function that only works on subclass objects
}
}
MyClass object1(1, 2); //should create MyClass object
MyClass object2(2, 1); //should create SubClass object

如上所示,当创建该类的实例时,我希望构造函数正常运行并生成该类,或者(取决于作为参数给定的值)将其作为派生SubClass的实例。请注意,它必须基于不同参数的值,而不仅仅是它们的类型。有可能做到这一点吗?如果有必要,只要只需要使用一个构造函数,就可以使用另一个派生类来表示"normal"选项(而不是使用纯bass类)。

如果这不可能,当我想要一个SubClass构造函数的实例时,我可以直接调用它,但这并不理想,因为每次创建它时,我都必须检查应该创建哪个,而不是在构造函数中只进行一次内部检查。

您可以将创建委托给MyClass:的静态函数

class SubClass;
//Base Class
class MyClass {
MyClass(int param1, int param2) {
}
public:
static unique_ptr<MyClass> Create(int param1, int param2) {
if (param1 > param2) { //(for example)
return std::make_unique<SubClass>(param,param2);
} else {
return std::make_unique<MyClass>(param,param2);
}
}
}
//Derived Class
class SubClass : public MyClass {
SubClass(int param1, int param2) {
//Subclass construction
}
public:
void function() {
//function that only works on subclass objects
}
}
std::unique_ptr<MyClass> object1 = MyClass::Create(1, 2); //should create MyClass object
std::unique_ptr<MyClass> object1 = MyClass::Create(2, 1); //should create SubClass object

您需要使用一个结构。它将根据您的params返回一个指向父类的指针。您将通过父类的接口来使用它。看见https://en.wikipedia.org/wiki/Abstract_factory_pattern和https://en.wikipedia.org/wiki/Factory_method_pattern