Как заставить 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() в цикле будет вызываться соответствующая версия метода для каждого объекта, позволяя вам добиться вызова методов наследника.