Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Wrailiv
0 / 0 / 0
Регистрация: 29.03.2016
Сообщений: 4
1

Вызвать виртуальный метод элемента вектора

28.04.2016, 20:27. Просмотров 390. Ответов 3
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Parent
{
public:
  Parent();
  virtual void fn();
}
 
class Child: public Parent
{
public
  Child(): Parent() {}
  void fn();
}
 
vector<Parent> mv;
mv.push_back(Child());
 
for (auto it=mv.begin(); it!=mv.end(); ++it)
{ it->fn(); } // вызывается Parent->fn(), а надо бы Child
Попробовал было
C++
1
2
vector<Parent*> mv;
mv.push_back(new Child());
компилятор хавает, но не удаётся обратиться к методу итератора
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2016, 20:27
Ответы с готовыми решениями:

Как вызвать метод вектора из динамического массива?
vector&lt;some_type&gt; *t=new vector&lt;int&gt; ; как вызвать метод из структуры\класса some_type? как...

Виртуальный метод
class A { virtual void Print()=0; } class B : public A { virtual void Print() {...

Виртуальный метод
Здравствуйте! Помогите, пожалуйста, найти ошибку в коде. #include &quot;stdafx.h&quot; class...

Заданный вектор А, состоящий из n элементов. Переставить компоненты вектора, размещенные после самого элемента вектора А
Заданный вектор А, состоящий из n элементов. Переставить компоненты вектора, размещенные после...

Виртуальный метод, шаблоны
Необходимо применить виртуальные методы? шаблон templete для какого нибудь метода(новичек) вообще...

3
Renji
2601 / 1787 / 536
Регистрация: 05.06.2014
Сообщений: 5,184
28.04.2016, 20:48 2
Цитата Сообщение от Wrailiv Посмотреть сообщение
mv.push_back(Child());
Обрежет Child до Parent.
Цитата Сообщение от Wrailiv Посмотреть сообщение
компилятор хавает, но не удаётся обратиться к методу итератора
(*it)->fn();.Хотя, конкретно в вашем случае удобней будет:
C++
1
2
for(auto&pos:mv)
   pos->fn();
Алсо, vector<Parent*> надо поменять на vector<std::unique_ptr<Parent> > (при уничтожении вектора, будет само delete элементов пинать).
0
Wrailiv
0 / 0 / 0
Регистрация: 29.03.2016
Сообщений: 4
28.04.2016, 21:27  [ТС] 3
Благодарю.
Про unique_ptr почитал в гугле, но там кратко, ничего насчёт "пинать delete" нет, поэтому вопрос: при clear(), erase() и pop_back() он их будет пинать? Если нет, я лучше ручками
0
Renji
2601 / 1787 / 536
Регистрация: 05.06.2014
Сообщений: 5,184
28.04.2016, 21:49 4
Цитата Сообщение от Wrailiv Посмотреть сообщение
Про unique_ptr почитал в гугле, но там кратко, ничего насчёт "пинать delete" нет, поэтому вопрос: при clear(), erase() и pop_back() он их будет пинать?
Да, при clear, pop_back и прочих разрушениях умного указателя, он сам прибьет объект которым владеет. А читать надо тут ("unique_ptr objects automatically delete the object they manage (using a deleter) as soon as they themselves are destroyed") или тут ("разрушает объект через его указатель, когда unique_ptr выходит из области видимости").
0
28.04.2016, 21:49
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2016, 21:49

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Указатель на виртуальный метод
По мотивам какого-то вопроса тут возник вопрос, ответ на который я что-то не придумал. Как взять...

Итератор и виртуальный метод
Есть задачка с гугла: #include &lt;iostream&gt; #include &lt;vector&gt; class A { public: A(int n...

Виртуальный метод с variadic аргументами ?
class ILogger { public: virtual ~ILogger(){ } virtual void DoLogV(LogLevel::e level, const...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.