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

21 Авг 2019 в 07:00
145 +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 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир