как получить доступ к дочерним экземплярам в векторе в С++

У меня есть родительский класс и дочерний класс (унаследованный от родителя). В дочернем классе у меня есть функция-член с именем function_blah();

Я использовал vector<parent*> A для хранения 5 родительских экземпляров, 3 дочерних экземпляров. Таким образом, общее количество элементов в векторе равно 8.

Я могу легко получить доступ к функциям-членам элементов от A[0] до A[4], которые являются родительскими экземплярами. Но всякий раз, когда я пытаюсь получить доступ к функциям-членам элементов от A[5] до A[7], компилятор жалуется, что class parent has no member named 'function_blah'

Я обращаюсь к элементам с помощью index. e.x A[i] с i = 0..7. Это правильно? если нет, то как?


person Community    schedule 02.04.2010    source источник
comment
Ваш вопрос неполный: каковы отношения между классами parent и дочерним классом?   -  person Klaim    schedule 03.04.2010
comment
дочерний класс наследуется от родительского класса   -  person    schedule 03.04.2010
comment
Он говорит, что у меня есть родительский класс и дочерний класс (унаследованный от родителя). Я думаю, что отношения ясны.   -  person Ben    schedule 03.04.2010


Ответы (3)


Вам нужно понизить указатель на дочерний класс, чтобы использовать дочерние функции на нем.

Когда вы обращаетесь к дочернему объекту с помощью parent*, вы фактически говорите компилятору: «Обрабатывать этот объект как parent». Поскольку function_blah() существует только в дочернем элементе, компилятор не знает, что делать.

Вы можете улучшить это, преобразовав с помощью оператора dynamic_cast:

child* c = dynamic_cast<child*>(A[6]);
c->function_blah();

Это выполнит проверенное во время выполнения, безопасное приведение типов из parent* в child*, где вы можете вызвать function_blah().

Это решение работает только в том случае, если вы знаете, что объект, который вы вытаскиваете, определенно имеет номер child, а не parent. Если есть неопределенность, вместо этого вам нужно использовать наследование и создать виртуальный метод для родителя, который вы затем перегружаете для дочернего элемента.

person Dan Story    schedule 02.04.2010
comment
Большое спасибо за ваши предложения. Я буду использовать виртуальные функции. - person ; 03.04.2010

Вы сохраняете parent*, у которого нет метода function_blah. Вам нужно либо сделать function_blah виртуальным методом родителя, либо использовать dynamic_cast для приведения к дочернему *.

person Ben    schedule 02.04.2010

Член _blah() объявлен виртуальным в parent? Или это даже объявлено в parent? Потому что если нет, то вы никогда не сможете получить доступ к _blah() через родительский указатель. И да, вам тоже придется опускаться, но только если вы точно знаете, что ожидаете тип child.

person Zoli    schedule 02.04.2010