Как заставить std::array различать родителя и наследника? Допустим, имеется класс Example и наследник ExampleDerived. Каким образом при помещении их обоих в std::array добиться вызова у наследника именно его версий методов, а не родительских? Это можно сделать только ручным кастом? Или же танцы с virtual?
Да, чтобы добиться вызова методов наследника в 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() в цикле будет вызываться соответствующая версия метода для каждого объекта, позволяя вам добиться вызова методов наследника.
Да, чтобы добиться вызова методов наследника в 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() в цикле будет вызываться соответствующая версия метода для каждого объекта, позволяя вам добиться вызова методов наследника.