Если у меня есть базовый класс с производным классом, можно ли создавать экземпляры как базовый или производный класс, зависящий от аргументов, переданных в один конструктор?
Пример кода:
//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
Как показано выше, когда создается экземпляр этого класса, я хочу, чтобы конструктор либо функционировал нормально и создавал класс, либо (в зависимости от значений, заданных в качестве аргументов) создавал его как экземпляр производного подкласса. Обратите внимание, что он должен основываться на значениях различных параметров, а не только на их типах. Можно ли сделать это? При необходимости было бы целесообразно иметь другой производный класс для представления «нормального» варианта (вместо использования класса чистого баса), если когда-либо должен использоваться только один конструктор.
Если это невозможно, я могу просто вызвать конструктор подкласса, когда мне нужен экземпляр этого, но это не идеально, так как мне пришлось бы проверять, какой из них должен создаваться каждый раз, когда он создается, а не просто иметь одну внутреннюю проверку в конструкторе.