|
|
|
Downcasting. Вроде так это называется...
|
|||
|---|---|---|---|
|
#18+
Сразу к делу: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Вот. Эта программа не скомпилируется - меня будут ругать, что z is not a member of class Base. Оно и понятно, потому как пойнтер типа Base. Слышал про такую штуку, Downcasting называется...ну, это чтобы пойнтер типа Derived мог указывать на Base... Задача у меня такая: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2006, 00:23 |
|
||
|
Downcasting. Вроде так это называется...
|
|||
|---|---|---|---|
|
#18+
Landanan Нужно чтобы это работало... Так нельзя. Полиморфно можно работать только с виртуальными функциями. С невиртуальными функциями и членами данными - нет. Т.е. можно конечно попробовать написать: Код: plaintext 1. или Код: plaintext 1. и даже может быть будет работать, но лучше так не делать, а пересмотреть дизайн, чтобы в таком приведении типов не возникало необходимости ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2006, 10:08 |
|
||
|
Downcasting. Вроде так это называется...
|
|||
|---|---|---|---|
|
#18+
redskin Так нельзя. Полиморфно можно работать только с виртуальными функциями. С невиртуальными функциями и членами данными - нет. Почему нельзя ? Можно, только вопрос -- зачем ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2006, 10:12 |
|
||
|
Downcasting. Вроде так это называется...
|
|||
|---|---|---|---|
|
#18+
MasterZiv redskin Так нельзя. Полиморфно можно работать только с виртуальными функциями. С невиртуальными функциями и членами данными - нет. Почему нельзя ? Можно, только вопрос -- зачем ? "Можно" то "можно", но как оно будет работать? Напишет автор что-нть вроде этого: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Потом вот это: Код: plaintext 1. 2. 3. 4. И оно скомпилится и заработает. А потом (случайно, нарочно, забудет, не поймет, еще что-нибудь) вот это: Код: plaintext 1. 2. 3. 4. И оно тоже скомпилится, но запустив получим Segmentation fault в лучшем случае. IMHO лучше сразу привыкать к хорошему и не писать так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2006, 10:24 |
|
||
|
Downcasting. Вроде так это называется...
|
|||
|---|---|---|---|
|
#18+
К вопросу о том, зачем так делать. Задание такое в универе: написать один базовый класс. Потом создать 3 наследственных класса. в главной проге должно быть что-то в этом роде: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. И всё в этом роде...Учитывая, что вся эта инфа будет считываться либо из файла, либо с клавы, по желанию юзера. Сами классы уже готовы и работают нормально. Однако данная система не работает, т.к. пойнтер list имеет тип Base и само-собой показывает только ту часть, которая принадлежит этому классу => я не имею доступа к членам наследственных классов через пойнтер на родительский класс... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2006, 12:50 |
|
||
|
Downcasting. Вроде так это называется...
|
|||
|---|---|---|---|
|
#18+
как насчет DYNAMIC_DOWNCAST или STATIC_DOWNCAST ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2006, 12:55 |
|
||
|
Downcasting. Вроде так это называется...
|
|||
|---|---|---|---|
|
#18+
Cerebrumкак насчет DYNAMIC_DOWNCAST или STATIC_DOWNCAST Таких операций нет в C++. А что на счет "опсной" программы с dynamic_cast<>, так там просто программа неправильная , с ошибкой. Должно быть : Код: plaintext 1. 2. 3. 4. 5. 6. 7. Ну так чтобы очень это было опасно, я бы не сказал. Вопрос идеологии. Посмотрите например на любую COM-программу, там получение интерфейсов из какого-то IUnknown - обычное дело. Это - то же самое. Только писать надо всегда правильно. Тут дело в другом, что надо про всех наследников знать, что это знание вкодировано в программу, что новых быть не может и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2006, 13:42 |
|
||
|
Downcasting. Вроде так это называется...
|
|||
|---|---|---|---|
|
#18+
вот выдержка из afx.h Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. и Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2006, 13:56 |
|
||
|
Downcasting. Вроде так это называется...
|
|||
|---|---|---|---|
|
#18+
Метод (Derived*)(list[0]) помог, спасибо! А можно ли конвертировать из Base в Derived навсегда? Чтобы потом, например, мог отобразить весь лист одним циклом: Код: plaintext 1. ? В данном листе находятся пойнтеры на 3 разных класса, и я не знаю какой тип где. Вот можно как-то сделать, чтобы при назначении пойнтера (list [i]=new Something;), менялся его тип? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2006, 15:15 |
|
||
|
Downcasting. Вроде так это называется...
|
|||
|---|---|---|---|
|
#18+
[quot MasterZivПосмотрите например на любую COM-программу, там получение интерфейсов из какого-то IUnknown - обычное дело. Это - то же самое. Только писать надо всегда правильно. Тут дело в другом, что надо про всех наследников знать, что это знание вкодировано в программу, что новых быть не может и т.п.[/quot] Если мне не изменяет память, то там используется reinterpret_cast... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2006, 10:54 |
|
||
|
Downcasting. Вроде так это называется...
|
|||
|---|---|---|---|
|
#18+
Если мне не изменяет память, то там используется reinterpret_cast... Да там все что хочешь может использоваться. Хоть C-style cast. Дело не в этом, а в том, что когда получаешь указатель на новый интерфейс, прежде чем с ним работать, надо его проверить, есть ли он вообще. Так и здесь, полная аналогия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2006, 20:38 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33687996&tid=2031442]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
146ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 440ms |

| 0 / 0 |
