Как получить доступ к дочерним экземплярам в векторе в C ++ - PullRequest
2 голосов
/ 03 апреля 2010

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

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

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

Способ доступа к элементам - использование индекса. e.x A [i] с i = 0..7. Это правильно? если нет, то как?

Ответы [ 3 ]

4 голосов
/ 03 апреля 2010

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

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

Вы можете улучшить это путем понижения с помощью оператора dynamic_cast:

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

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

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

2 голосов
/ 03 апреля 2010

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

0 голосов
/ 03 апреля 2010

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

...