В приведенном ниже коде список инициализаторов инициализируется с помощью объекта B и C, чьи чарты проходят со значениями «bbb» и 333 соответственно. Поскольку эти объекты происходят от A, список правильно создает два элемента A.Инициализация времени выполнения компиляции и время выполнения, доступ к вектору initializer_list, содержащему производные элементы
#include <string>
#include <vector>
#include <iostream>
struct A
{
char ch;
};
struct B : A
{
B(std::string str) : str(str) {}
std::string str;
};
struct C : A
{
C(int num) : num(num) {}
int num;
};
struct D
{
D(std::initializer_list< A* > initializerList)
: variadicVect(initializerList)
{}
std::vector< A* > variadicVect;
};
int main()
{
D d { new B { "bbb" }, new C { 333 } };
d.variadicVect[ 0 ]->ch = 'm'; // ok, but accesses base member
//std::cout << d.variadicVect[ 0 ]->str << std::endl; // error C2039: 'str': is not a member of 'A'
//std::cout << d.variadicVect[ 1 ]->num << std::endl; // error C2039: 'num': is not a member of 'A'
return 0;
}
Аналогичная проблема сообщалось в link разрешаемые @ Jarod42. В качестве проблемы он определил Object Slicing. Чтобы избежать этой проблемы с присваиванием по умолчанию, я новичок в объекте списка инициализаторов, но до сих пор не могу получить доступ к производному классу.
Еще одна попытки, я попытался была templatize в initializer_list типа (код не показан), но я получил эту ошибку: «D :: variadicVect»: только шаблоны членов статических данных разрешены»
Моей цели должна быть способный инициализировать список различными производными объектами, выбирая производный тип во время компиляции и тем не менее иметь доступ к ним должным образом во время выполнения. Это возможно?
Подумайте, что вы просите код. У вас есть 'std :: vector' указателей' A'. Знает ли 'A' о членах, к которым вы пытаетесь получить доступ? – NathanOliver
В этом коде нет нарезки. Связанный вопрос существенно отличается. Проблема в этом коде заключается в том, что 'A' не имеет члена' str', поэтому вы не можете применить '-> str' к' A * '. –