Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как перегрузить методы без виртуалок
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. как отнаследовать later, чтобы first вызвал myName из later, а то этот пример в обоих случаях вызывает first::myName() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2012, 17:06 |
|
||
|
Как перегрузить методы без виртуалок
|
|||
|---|---|---|---|
|
#18+
В сначала вызывается конструктор базового класса, потом уже производного. Таким образом, у вас по любому будет вызываться first::myName() потому, что он в конструкторе базового класса. Что бы переопределить myName() производном классе нужно, что то типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2012, 17:20 |
|
||
|
Как перегрузить методы без виртуалок
|
|||
|---|---|---|---|
|
#18+
Sheraton, просто есть контрол, которому хочется заменить пару методов, подменяющих источник данных и чтобы все остальное у него работало как и работает сейчас. А точки клиентского кода, где юзается интерфейс этого контрола мне трогать не хочется... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2012, 17:49 |
|
||
|
Как перегрузить методы без виртуалок
|
|||
|---|---|---|---|
|
#18+
Lumixкак отнаследовать later, чтобы first вызвал myName из later, а то этот пример в обоих случаях вызывает first::myName() Вы очевидно не понимаете, что внутри конструктора first() { ... } его наследник, объект later еще не сконструирован, и в его полях находятся случайные значения. Поэтому вызов любого его метода - это выстрел в ногу. Который вы при желании естественно можете сделать: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Помните, что к полям later в методе later::myName (и вызываемых из него) нельзя обращаться, также как и к полям других базовых классов указанных после first в списке предков later. В общем, я рекомендую никогда так не делать, потому что проверять вместо компилятора такие ограничения с ростом проекта будет все сложнее и рано или поздно (скорее рано) отстрел ноги таки произойдет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2012, 18:14 |
|
||
|
Как перегрузить методы без виртуалок
|
|||
|---|---|---|---|
|
#18+
Lumixпросто есть контрол, которому хочется заменить пару методов, подменяющих источник данных и чтобы все остальное у него работало как и работает сейчас. А точки клиентского кода, где юзается интерфейс этого контрола мне трогать не хочется... Сделайте не наследование, а агрегацию (делегирование). Т.е. создайте новый класс, в котором будет одно поле - экземпляр старого класса. В новом классе объявите все методы из старого класса, в которых просто вызовите одноименные методы поля. Ну кроме тех которые вы хотите переопределить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2012, 18:19 |
|
||
|
Как перегрузить методы без виртуалок
|
|||
|---|---|---|---|
|
#18+
Хотя конечно, если из конструктора старого класса уже вызывается некий его метод, то не модифицируя этот класс вы никак не переопределите этот метод, если он невиртуальный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2012, 18:25 |
|
||
|
Как перегрузить методы без виртуалок
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyХотя конечно, если из конструктора старого класса уже вызывается некий его метод, то не модифицируя этот класс вы никак не переопределите этот метод, если он невиртуальный. ок, понятно сэкономить не получится что-нибудь замутим как обычно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2012, 19:09 |
|
||
|
Как перегрузить методы без виртуалок
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyХотя конечно, если из конструктора старого класса уже вызывается некий его метод, то не модифицируя этот класс вы никак не переопределите этот метод, если он невиртуальный. Подскажите, каким же образом переопределить виртуальный метод, вызываемый из конструктора базового класса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2012, 21:27 |
|
||
|
Как перегрузить методы без виртуалок
|
|||
|---|---|---|---|
|
#18+
QuartzAnatoly MoskovskyХотя конечно, если из конструктора старого класса уже вызывается некий его метод, то не модифицируя этот класс вы никак не переопределите этот метод, если он невиртуальный. Подскажите, каким же образом переопределить виртуальный метод, вызываемый из конструктора базового класса? Ну я неточно выразился. В одну фразу впихнул две. Виртуальный переопределить можно, но из конструктора его вызвать нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2012, 21:40 |
|
||
|
Как перегрузить методы без виртуалок
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, ну если уж совсем точно: ISO/IEC 14882 12.7.4When a virtual function is called directly or indirectly from a constructor or from a destructor, including during the construction or destruction of the class’s non-static data members, and the object to which the call applies is the object (call it x) under construction or destruction, the function called is the final overrider in the constructor’s or destructor’s class and not one overriding it in a more-derived class. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2012, 21:13 |
|
||
|
Как перегрузить методы без виртуалок
|
|||
|---|---|---|---|
|
#18+
Mozokну если уж совсем точно:...самый лёгкий способ получить pure virtual function call ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2012, 00:04 |
|
||
|
Как перегрузить методы без виртуалок
|
|||
|---|---|---|---|
|
#18+
egorychMozokну если уж совсем точно:...самый лёгкий способ получить pure virtual function call А компилятор пропустит? MSVC 2010 ругается LNK2001: unresolved external. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2012, 01:21 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38007358&tid=2020729]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
188ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
| others: | 12ms |
| total: | 293ms |

| 0 / 0 |
