|
|
|
переопределение функции класса
|
|||
|---|---|---|---|
|
#18+
у меня есть форма Fgrid. на ней есть кнопка Button4, в обработчике которой содержится ShowMessage("ааа"); я хочу сделать такую же форму, но с другим обработчиком этой же кнопки. мне это видится так: у меня есть класс (форма). мне нужно, чтоб в одонм случае одна его функция выполняла одни действия, в другом другие. но не так чтобы там было куча условий. а как-то на уровне переопределения этой функции. значит как я понимаю мне нужно создать новый класс-потомк от исходного и в определенни этого класса написать нужную мне функци. а потом создаю объект этого класса и юзаю его. я правильно понимаю всю логику? пробую так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. но проблема в том, что новая форма не унаследовала метод Show(). что я сделал не правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2005, 14:23 |
|
||
|
переопределение функции класса
|
|||
|---|---|---|---|
|
#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. hello from C1 hello from C2 hello from C2 hello from C2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2005, 15:18 |
|
||
|
переопределение функции класса
|
|||
|---|---|---|---|
|
#18+
спасибо. в моем примере я вроде делал также, тока не указал public теперь нужные мне методы видны, но теперь возникает ошибка компиляции: [Linker Error] Unresolved external 'newf:: (huge)' referenced from C:\CBUILDER6\PROJECTS\UNIT1.OBJ [Linker Error] Unresolved external 'newf::newf()' referenced from C:\CBUILDER6\PROJECTS\UNIT1.OBJ я компилирую в BCB6. вот полный листинг моей тестовой проги: Код: 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. т.е. это форма. на ней 3 кнопки: открыть новую форму, закрыть, и вывести сообщение. что не нравится компилятору? как поправить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2005, 15:34 |
|
||
|
переопределение функции класса
|
|||
|---|---|---|---|
|
#18+
Билдера у меня нет, но ошибка видна невооруженным глазом. Ты объявил конструктор для класса newf, а реализацию написать забыл. Либо убери из описания класса строчку Код: plaintext 1. (тогда он будет сгенерен по умолчанию) Или напиши тело конструктора. Так: Код: plaintext 1. или за пределами описания класса: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2005, 15:46 |
|
||
|
переопределение функции класса
|
|||
|---|---|---|---|
|
#18+
опят не получается.. по умолчанию конструктор не генерится. поэтому я его и прописал вручную. но когда я пишу так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. мне компилятор говорит, что [C++ Error] Unit1.cpp(18): E2251 Cannot find default constructor to initialize base class 'TForm1' а при такой записи: newf::newf(); // (вне тела класса) [C++ Error] Unit1.cpp(21): E2333 Class member 'newf::newf()' declared outside its class ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2005, 16:16 |
|
||
|
переопределение функции класса
|
|||
|---|---|---|---|
|
#18+
Судя по сообщениям об ошибке, у класса TForm1 нет конструктора без параметров. Т.е. ситуация примерно следующая: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. error C2512: 'C1' : no appropriate default constructor available Надо добавить инициализацию базового класса, т.е. написать вместро строки помеченной /* 1 */ так: Код: plaintext Но лучше в производном классе поддержать интерфейс базового, т.е. предоставить по крайней мере не меньший набор конструкторов, чем у родителя: Код: 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. Какие точно параметры требует твой случай, т.е. конструкторы класса TForm1, посмотри сам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2005, 17:02 |
|
||
|
переопределение функции класса
|
|||
|---|---|---|---|
|
#18+
конструктор класса TForm описан как __fastcall TForm1(TComponent* Owner); как я понял конструктор производного класса тоже должен иметь параметр того же типа? попробовал сделать так: newf(TComponent* c1): TForm1(c1) {} [C++ Error] Unit1.cpp(19): E2113 Virtual function 'newf::newf(TComponent *)' conflicts with base class 'TForm1' переделал таким образом: newf(): TForm1(0) {} так работает. т.е. компилится и прога запускается. как я понял эта запись означает что конструктором для класса newf() является конструктор TForm1() с параметром =0? но возникла еще одна проблема: я создаю экземпляр объекта newf *fn; fn = new newf(); fn->Show(); новое окно открывается, такое же как и исходное. но функция - обработчик кнопки - не переопределилась. т.е. то чего я пытался добиться - не работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2005, 18:03 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33206309&tid=2032916]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
65ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 250ms |
| total: | 421ms |

| 0 / 0 |
