Форум программистов, компьютерный форум CyberForum.ru

STL и полиморфизм - C++

Восстановить пароль Регистрация
 
IloveOOP
0 / 0 / 0
Регистрация: 23.10.2013
Сообщений: 19
23.10.2013, 22:32     STL и полиморфизм #1
Доброго времени суток!
Исходная информация: класс а-базовый,b-производный у этих ребят определён виртуальный метод(для класса "a" возрачает-1,для "b"-2);
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class a
{
public: 
    virtual int To()
    {
        return 1;
    }
};
 
class b : public a
{   
public: 
    virtual int To()
    {
        return 2;
    }
 
};
беда в том,что я решил хранить их в контейнере...

C++
1
2
3
4
5
6
 list<a*> myList;
    myList.push_back(new a());
    myList.push_back(new b());
 
    list<a*>::iterator I=myList.begin();
    cout<<(*I)->To()<<'\t'<<(*(++I))->To()<<'\n';
парадокс в том,что оба раза вызывается метод производного класса(т.е. вывод: "2 2")...Будьте добры,объясните причину,т.к. препод которому я делаю лабу(это не лаба,а иллюстрация проблемы) не любит ооп, послал меня и сделал -10 к моей самооценки,на вас,господа,надежда
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2013, 22:32     STL и полиморфизм
Посмотрите здесь:

Полиморфизм C++
Полиморфизм :( C++
C++ Полиморфизм
stl и полиморфизм C++
Полиморфизм c++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.10.2013, 22:43     STL и полиморфизм #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от IloveOOP Посмотреть сообщение
C++
1
cout<<(*I)->To()<<'\t'<<(*(++I))->To()<<'\n';
беда в том что порядок вычисления аргументов стандартом не определен, если ты напищешь
f() + g()
то компилятор имеет право сначало вызвать ф-ю g, а затем f.
аналогично у тебя в коде, твой компилятор сначала инкрементирует итератор, а затем выводит, но к моменту вывода итератор уже изменен.
выведи лист циклом
C++
1
2
for (list<a*>::iterator it = myList.begin(); it != myList.end(); ++it)
        cout << (*it)->To() << endl;
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6158 / 2887 / 282
Регистрация: 04.12.2011
Сообщений: 7,686
Записей в блоге: 3
23.10.2013, 23:06     STL и полиморфизм #3
Да, l-value до и после инкрементирования в коде не разделённом точками следования.
C++
1
2
cout<<(*I)->To()<<endl;//1 ok
cout<<(*(++I))->To()<<endl;//2 ok
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
24.10.2013, 00:33     STL и полиморфизм #4
Цитата Сообщение от IGPIGP Посмотреть сообщение
l-value до и после инкрементирования в коде не разделённом точками следования
Понятия 'sequence points' в стандарте уже нет.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6158 / 2887 / 282
Регистрация: 04.12.2011
Сообщений: 7,686
Записей в блоге: 3
24.10.2013, 00:41     STL и полиморфизм #5
Цитата Сообщение от ct0r Посмотреть сообщение
Понятия 'sequence points' в стандарте уже нет.
Как же теперь правильно сказать?
Как я понимаю, граница простого оператора это ;
и в случае, если в пределах одного оператора (или выражения) используется var и ++var, то поведение не определено.
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
24.10.2013, 01:00     STL и полиморфизм #6
Цитата Сообщение от IGPIGP Посмотреть сообщение
Как же теперь правильно сказать?
Из-за введения новой модели памяти в C++11 появились понятия sequenced before и unsequenced. Они применяются например тут.
The value computations of the operands of an operator are sequenced before the value computation of the result of the operator. If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2013, 02:16     STL и полиморфизм
Еще ссылки по теме:

C++ Полиморфизм
Полиморфизм C++
C++ Полиморфизм

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

Или воспользуйтесь поиском по форуму:
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,397
24.10.2013, 02:16     STL и полиморфизм #7
Тот же UB, только в профиль.
Суть в том, что компилятор имеет право высчитывать в одном операторе операнды как ему хочется, а не как мы можем ожидать.
Цитата Сообщение от IloveOOP Посмотреть сообщение
беда в том,что я решил хранить их в контейнере...
вы используете коллекцию. Кстати, память надо бы в ней освободить, занятую переменными, на которую ссылаются указатели-элементы.
Yandex
Объявления
24.10.2013, 02:16     STL и полиморфизм
Ответ Создать тему
Опции темы

Текущее время: 13:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru