Возможно ли возвращать потомков абстрактного класса из функции? Есть функция, которая в зависимости от входящего значения, создаёт объект определённого класса, который наследуется от абстрактного. Возможно ли как-то вернуть этот объект по ссылке на базовый класс, не создавая его через new и не по указатею?

21 Авг 2019 в 07:06
188 +1
0
Ответы
1

Да, возможно вернуть потомков абстрактного класса из функции, используя ссылку на базовый класс. Для этого можно создать объект нужного класса внутри функции и вернуть его по ссылке на базовый класс.

Пример:

#include <iostream>
class AbstractClass {
public:
virtual void someFunction() = 0;
};
class ConcreteClass : public AbstractClass {
public:
void someFunction() override {
std::cout << "ConcreteClass" << std::endl;
}
};
AbstractClass& createObject(int value) {
if (value == 1) {
static ConcreteClass object;
return object;
} else {
// можно вернуть какой-то другой объект-потомок абстрактного класса
// или бросить исключение в случае необходимости
throw std::invalid_argument("Invalid value");
}
}
int main() {
AbstractClass& obj = createObject(1);
obj.someFunction();
return 0;
}

В данном примере функция createObject создает объект класса ConcreteClass и возвращает его по ссылке на AbstractClass. Далее в функции main этот объект используется как объект базового класса, при этом вызывается метод someFunction класса ConcreteClass.

Однако, нужно быть осторожным при использовании такого подхода, т.к. в случае статического объекта, который создается внутри функции, возможны проблемы с жизненным циклом объекта и его областью видимости.

20 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир