|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Добрый вечер, хотелось чтобы приведенный код выводил ABC (сейчас выводит AAA) Без использования ссылок (& и ->) т.е. без адресации руками, в чистом плюсовом стиле. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 20:15 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Candid2018, Всё очень просто. По шагам: 1) Найти и понять причину такого поведения 2) Поставить задачу на конкретные изменения 3) Изобразить в коде Начинайте с первого. Где и почему код так себя ведёт? (круглый) ЗЫ Либо бросайте это всё нафик - это не Ваше. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 20:40 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Candid2018, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 21:14 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Фэйтл Эра, так, конечно, работает, но хотелось бы реализовать без передачи адресов объектов руками. Конструкторы копирования как то переопределить... Чтобы при помещении в контейнер объекты оставались своего типа, а не приводились к базовому. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 21:26 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Candid2018Чтобы при помещении в контейнер объекты оставались своего типа, а не приводились к базовому. Ты сам объявил контейнер объектов базового типа. Так что обломись. Не хочешь связываться с передачей адресов руками - делай контейнер умных указателей. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 21:44 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 21:51 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Candid2018сейчас выводит AAAпоздравляю, ты изобрёл срезку )) Candid2018Без использования ссылок (& и ->) т.е. без адресации руками, в чистом плюсовом стиле. в чисто явском стиле, ты хотел сказать, да?)) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 21:55 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Насколько я понимаю СТЛ коллекция должна заранее знать размер помещаемого объекта в коллецию Размеры B и A разные поэтому при попытке положить B происходит его каст к A и копирование. Разумеется при этом слетает начиста все таблицы виртуальных методов и ты видишь неверную печать Возможно так станет понятнее Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 21:58 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
--положить B происходит его каст к A и копирование Оригинальный объект B передается в конструктор копирования A Никакого каста не происходит ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 21:59 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
semen.s.semenпри попытке положить B происходит его каст к A и копирование.происходит не каст, а срезка, то есть данные, характерные для класса B просто теряются, в том и числе и таблица виртуальных функций. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:06 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Модератор: Перестань задирать людей. Исправлять свои ошибки хорошо, исправлять чужие тоже хорошо. Обижаться что тебя поправили - очень не хорошо. White Owl ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:11 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, спасибо. Данный код решает проблему Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:40 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Candid2018Dimitry Sibiryakov, спасибо. Данный код решает проблему Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Может лучше std::make_unique ? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:42 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
semen.s.semenМожет лучше std::make_unique ? Предлагаю подумать что будет в этом случае с таким кодом: Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:53 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Anatoly Moskovskysemen.s.semenМожет лучше std::make_unique ? Предлагаю подумать что будет в этом случае с таким кодом: Код: plaintext 1. 2. 3. 4. 5.
Да ступил unique_ptr не работает тут vector<unique_ptr<A>> vA; vA.push_back(std::make_unique<A>()); vA.push_back(std::make_unique<B>()); vA.push_back(std::make_unique<C>()); for(auto v:vA) v->print(); Не компилится ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:56 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Anatoly Moskovskysemen.s.semenМожет лучше std::make_unique ? Предлагаю подумать что будет в этом случае с таким кодом: Код: plaintext 1. 2. 3. 4. 5.
Так Сём Сёмыч не предлагает менять тип в контейнере, только вызывать, make_unique вместо make_shared. Его право. Это даже скомпилируется и будет работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:57 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Вот так работает ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:57 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
NekZЭто даже скомпилируется и будет работать. Не скомпилируется и работать не будет ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:58 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
semen.s.semenВот так работает Лучше сделать print() const'ом и итерироваться по const-ссылкам ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:58 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
semen.s.semenНе компилится А, ну да. Правда я имел ввиду другое, но компилятор умнее )) А чтобы unique_ptr применить надо for (auto& v...) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:58 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
semen.s.semenNekZЭто даже скомпилируется и будет работать. Не скомпилируется и работать не будет Почему? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:59 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
NekZsemen.s.semenпропущено... Не скомпилируется и работать не будет Почему? error: call to implicitly-deleted copy constructor of 'std::__1::unique_ptr<A, std::__1::default_delete<A> >' for (auto v : vA) Потому ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:59 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
NekZsemen.s.semenВот так работает Лучше сделать print() const'ом и итерироваться по const-ссылкам Почему ? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 23:03 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
semen.s.semenNekZпропущено... Почему? error: call to implicitly-deleted copy constructor of 'std::__1::unique_ptr<A, std::__1::default_delete<A> >' for (auto v : vA) Потому Ты не вник в то, что я написал, да? Как обычно, это твоя фича. Я написал, что не обязательно менять тип в контейнере. Можно спокойно делать Код: plaintext 1. 2.
Т.к. shared_ptr имеет конструктор из unique_ptr&& ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 23:04 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
NekZsemen.s.semenпропущено... error: call to implicitly-deleted copy constructor of 'std::__1::unique_ptr<A, std::__1::default_delete<A> >' for (auto v : vA) Потому Ты не вник в то, что я написал, да? Как обычно, это твоя фича. Я написал, что не обязательно менять тип в контейнере. Можно спокойно делать Код: plaintext 1. 2.
Т.к. shared_ptr имеет конструктор из unique_ptr&& А еще он имеет целый int для подсчета ссылок Прикинь какой оверхед - если вектор огромный ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 23:05 |
|
|
start [/forum/topic.php?fid=57&msg=39753659&tid=2017693]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
5ms |
track hit: |
27ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 151ms |
0 / 0 |