|
|
|
Operator overloading + inheritance
|
|||
|---|---|---|---|
|
#18+
Допустим, есть один класс: Код: 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. Вот, это первый класс. У него имеется наследственный класс: Код: 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. Вот вопрос: как во втором классе при "перегрузке" оператора сделать чтобы вначале запускался перегруженный оператор класса first, а уж потом добавлялись новые значения (в данном случае z)? Примерно как в случае с конструкторами (для того их и написал). Уже часа 3 бьюсь и не могу врубиться :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2006, 22:30 |
|
||
|
Operator overloading + inheritance
|
|||
|---|---|---|---|
|
#18+
попробуй так Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2006, 00:03 |
|
||
|
Operator overloading + inheritance
|
|||
|---|---|---|---|
|
#18+
Я еще хочу добавить, что у тебя здесь неполиморфный метод operator << (..., const first& f); (именно так кстати, const first & ) Если у тебя будет ссылка типа const first& , но ссылаться она будет реально на объект класса second, то все равно вызовется метод для first, а данные second не выведутся ( как результат ). Это делается так : в классе-предке объявляется virtual member function для вывода данного элемента в поток. В этом же классе (один раз !!) пишется operator << (невиртуальный), который в реализации вызывает этот метод вывода в поток. В наследниках метод вывода в поток реализуется, operator << уже не нужно определять. Вообще, я давно себе принял (и не только я) за хороший стиль определять все операторы только как синтаксические оболочки над какой-то функциональностью, а сама функциональность должна быть реализована в обычных методах. Это и гибче, и позволяет пользователям, которые не любят переопределенные операторы, их не использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2006, 11:53 |
|
||
|
Operator overloading + inheritance
|
|||
|---|---|---|---|
|
#18+
автор еще хочу добавить, что у тебя здесь неполиморфный метод operator << (..., const first& f); (именно так кстати, const first & ) Насчет const - это само-собой разумеется, просто второпях забыл написать :) авторЭто делается так : в классе-предке объявляется virtual member function для вывода данного элемента в поток. В этом же классе (один раз !!) пишется operator << (невиртуальный), который в реализации вызывает этот метод вывода в поток. В наследниках метод вывода в поток реализуется, operator << уже не нужно определять. Вообще, я давно себе принял (и не только я) за хороший стиль определять все операторы только как синтаксические оболочки над какой-то функциональностью, а сама функциональность должна быть реализована в обычных методах. Это и гибче, и позволяет пользователям, которые не любят переопределенные операторы, их не использовать. Если я правильно понимаю, в классе-предке ты предлагаешь сделать что-то типа этого: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Вот тут мне все-таки непонятно как перегрузить оператор во втором классе :( В смысле, как сделать, чтобы, допустим, при команде в main.cpp Код: plaintext 1. 2. 3. вначале делалось всё, что делалось в первой перегрузке? Могу, конечно, накатать что-то в этом роде: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Но это такой "лобовой" метод, я тут не использую написанный ранее код, потому сама идея наследственности получается как-то не особо нужна :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2006, 13:23 |
|
||
|
Operator overloading + inheritance
|
|||
|---|---|---|---|
|
#18+
Landanan Если я правильно понимаю, в классе-предке ты предлагаешь сделать что-то типа этого: ... Нет. Смысл в том, чтобы для каждого класса написать виртуальную функцию, которая будет выводить его содержимое в поток. Тогда оператор вывода << можно написать в виде обертки только один раз, сделав его другом самого верхнего класса. Типа такого: Код: 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. 49. 50. 51. Вот тут мне все-таки непонятно как перегрузить оператор во втором классе :( Если ты хочешь писать оператор вывода в поток для каждого класса, то чем не устроил тот вариант, который я предложил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2006, 14:07 |
|
||
|
Operator overloading + inheritance
|
|||
|---|---|---|---|
|
#18+
Если ты хочешь писать оператор вывода в поток для каждого класса, то чем не устроил тот вариант, который я предложил? Первый вариант работает на ура, спасибо тебе за него огромное! Но все равно хочется узнать разные методы :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2006, 15:00 |
|
||
|
Operator overloading + inheritance
|
|||
|---|---|---|---|
|
#18+
А можно ли как-то приспособить первый вариант для перегрузки оператора >>? Мой код выглядит примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. И не работает :( Значения для x.z вводятся нормально, но при попытке отображения второго класса, значения x.x и x.y выводятся те, которые были установлены в first::first(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2006, 17:46 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33680918&tid=2031468]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
183ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 261ms |
| total: | 564ms |

| 0 / 0 |
