C++ 是否可以根据提供给单个构造函数的参数创建派生而不是 bass class?

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

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

示例代码:

//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

如上所示,当创建此 class 的实例时,我希望构造函数正常运行并生成 class,或者(取决于作为参数给出的值)生成它作为派生子类的实例。请注意,它必须基于不同参数的值,而不仅仅是它们的类型。是否有可能做到这一点?如有必要,可以使用另一个派生 class 来表示 'normal' 选项(而不是使用纯低音 class),只要只使用一个构造函数即可。

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

您需要使用面料。根据您的参数,它将 return 指向 parent class 的指针。您将通过 parent class 的界面使用它。参见 https://en.wikipedia.org/wiki/Abstract_factory_pattern and https://en.wikipedia.org/wiki/Factory_method_pattern

您可以将创建委托给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