Как заставить std::array различать родителя и наследника? Допустим, имеется класс Example и наследник ExampleDerived. Каким образом при помещении их обоих в std::array добиться вызова у наследника именно его версий методов, а не родительских? Это можно сделать только ручным кастом? Или же танцы с virtual?

21 Авг 2019 в 07:00
121 +1
0
Ответы
1

Да, чтобы добиться вызова методов наследника в std::array, вам необходимо воспользоваться указателями или ссылками на родительский класс, так как std::array хранит объекты одного типа.

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

Вот пример кода:

#include <iostream>
#include <array>
class Example
public
virtual void print()
std::cout << "Example" << std::endl

}
class ExampleDerived : public Example
public
void print() override
std::cout << "ExampleDerived" << std::endl

}
int main()
std::array<Example*, 2> arr = {new Example(), new ExampleDerived()}
for (auto elem : arr)
elem->print()

for (auto elem : arr)
delete elem

return 0
}

В данном примере создается std::array указателей на объекты класса Example. При вызове метода print() в цикле будет вызываться соответствующая версия метода для каждого объекта, позволяя вам добиться вызова методов наследника.

20 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 90 663 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир