Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как корректно использовать virtual функции в C++ ? virtual и контейнеры 
:(
    Опции темы
Nendis
  Дата 23.2.2013, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 26.11.2010

Репутация: нет
Всего: нет



Есть класс:
class A {
public:
virtual string print() {cout << "A"};
}

и 

class B : public A {
public:
virtual string print() {cout << "B"};
}

Я создаю коллекцию-вектор:

vector<A> mylst;

далее заполняю ее след образом:

mylst[0] = A();
mylst[1] = B();

При обращении в цикле к каждому елементу и вызову функции Print() всегда печатаеться сообщение "A" как исправить - что бы печаталось сначала "А" а потом "В" ?
PM MAIL   Вверх
NoviceF
Дата 23.2.2013, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



Так как вектор принимает объекты по значению, происходит срезка и в векторе конструируются только объекты А.

Если нужен полиморфизм, то нужно использовать указатели или ссылки.
PM MAIL   Вверх
Nendis
Дата 23.2.2013, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 26.11.2010

Репутация: нет
Всего: нет



Спасибо за ответ. Не могли бы привести мне пример объявления коллекции с поддержкой такого полиромфизма. Если честно, в указателях не силен, а пример в интернете подбной реализации затрудняюсь найти.
PM MAIL   Вверх
maxim1000
Дата 23.2.2013, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



например, так
Код

std::vector<std::unique_ptr<A>> mylst;
mylst.push_back(std::unique_ptr<A>(new A));
mylst.push_back(std::unique_ptr<B>(new B));



--------------------
qqq
PM WWW   Вверх
NoviceF
Дата 23.2.2013, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



Ну для полноты картины

Код

#include <iostream>
#include <memory>
#include <vector>

using namespace std;

class A
{
public:

    virtual ~A() { }

    virtual void print()
    {
        cout << "A" << endl;
    }
};

class B : public A
{
public:

    virtual void print()
    {
        cout << "B" << endl;
    }
};

int main()
{
    std::vector < std::unique_ptr < A >> mylst;
    mylst.push_back(std::unique_ptr<A > (new A));
    mylst.push_back(std::unique_ptr<B > (new B));

    for (std::unique_ptr<A >& x : mylst)
    {
        x->print();
    }
}


http://liveworkspace.org/code/3ijTV2$13
PM MAIL   Вверх
VSB
Дата 23.2.2013, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.8.2007

Репутация: нет
Всего: 2



NoviceF,  ну уж если по-правильному, то так

Код

#include <iostream>
#include <memory>
#include <vector>

using namespace std;

class A
{
public:

    virtual ~A() { }

    virtual void print() const
    {
        cout << "A" << endl;
    }
};

class B : public A
{
public:

    virtual void print() const
    {
        cout << "B" << endl;
    }
};

int main()
{
    vector<unique_ptr<A>> mylst;
    mylst.push_back(unique_ptr<A>(new A));
    mylst.push_back(unique_ptr<B>(new B));

    for (const auto & x : mylst)
    {
        x->print();
    }
}


http://liveworkspace.org/code/1Xz9lx$1
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1173 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.