
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
05.07.2005, 15:19
|
|||
|---|---|---|---|
|
|||
Производные классы в C++ |
|||
|
#18+
Простой вопрос. Как использовать в базовом классе перегруженные функции-члены ещё не определённого производного класса? Есть несколько извратный вариант... Может можно проще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2005, 16:36
|
|||
|---|---|---|---|
Производные классы в C++ |
|||
|
#18+
Можно чуть подробней, что именно требуется? (хорошо бы посмотреть на вариант, который "извратный"). И главное, зачем это требуется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2005, 17:06
|
|||
|---|---|---|---|
|
|||
Производные классы в C++ |
|||
|
#18+
Если класс еще не определен, откуда у него взялись перегруженные методы? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2005, 17:21
|
|||
|---|---|---|---|
Производные классы в C++ |
|||
|
#18+
Если идёт речь о виртуальных методах, то сущность базового класса (нахрена он нужен) - заключаеться в выделении общей логики поведения для чайлдов отнаследуемых от него. Например... Если у базового класса "ЗВЕРЬ" есть зубы (и они у него определены чиссо как виртуальные гы. :) ), то отнаследовать от данного класса чайлда "УЛИТКУ" - будет крайне проблематично :) удачи Вам (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2005, 17:25
|
|||
|---|---|---|---|
|
|||
Производные классы в C++ |
|||
|
#18+
class A { public: void Fun1(){/*некоторое определение...*/} void UseFun1() { Fun1(); } // Как-то используется void A::Fun1() }; class B:public A { public: void Fun1(){/*перегрузка функции void A::Fun1()*/} }; void main() { A myA; B myB; B.UseFun1(); } Вопрос "на засыпку": что вызовется последней строкой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2005, 17:28
|
|||
|---|---|---|---|
|
|||
Производные классы в C++ |
|||
|
#18+
Сорри ;) последняя строка: myB.UseFun1(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2005, 17:34
|
|||
|---|---|---|---|
Производные классы в C++ |
|||
|
#18+
DavydСорри ;) последняя строка: myB.UseFun1(); 1) Это не перегрузка, это переопределение 2) Рекомендую прочитать в какой-нибудь книге по c++ главу про виртуальные функции 3) Если объекты создаются на стеке, а не динамически, то и виртуальность в нашем случае мало поможет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2005, 17:50
|
|||
|---|---|---|---|
|
|||
Производные классы в C++ |
|||
|
#18+
Благодарю! Правда, про виртуальные функции я уже битый час читаю: ничего нового, но извратный вариант можно сообразить ;) Поясню... Хотелось бы, чтобы myB.UseFun1(); использовала B::Fun1(), а не A::Fun1() Простое объявление A::Fun1() как виртуальной, увы, здесь не помогает :( Извратный вариант. class A { A* pA; public: A(){} A(A* set_pA){ pA=set_pA; } virtual void Fun1(){/*некоторое определение...*/} void UseFun1() { pA->Fun1(); } // Как-то используется void A::Fun1() }; class B:public A { public: B(){ A::A(this); } void Fun1(){/*перегрузка функции void A::Fun1()*/} }; void main() { B myB; myB.UseFun1(); } Теперь последняя строка вызывает B::Fun1() ВОПРОС: есть ли средства в С++, позволяющие получить тот же результат более элегантно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2005, 17:50
|
|||
|---|---|---|---|
Производные классы в C++ |
|||
|
#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. 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2005, 17:50
|
|||
|---|---|---|---|
Производные классы в C++ |
|||
|
#18+
ОТВЕТ... нихрена не вызоветься....и даже не компильнёться... потому, что... в строке... B.UseFun1(); // попытка позвать статично, не статический метод... если имелось ввиду... myB.UseFun1(); то позовёться метод юзе фанк у класса А и тот в свою очередь позовёт свой же метод фанк одын (класс А). Одноимённые методы, если не обьявлены как виртуальные "зовуться" из области видимости. с уважением (круглый) ЗЫ Встречная "засыпка"... class A { public: A() { printf("Constructor A\r\n"); Fun1(); }; virtual void Fun1() { printf("A::Fun1\r\n"); }; }; class B: public A { public: virtual void Fun1() { printf("B::Fun1\r\n"); }; }; int main() { printf("Main\r\n"); B myB; myB.Fun1(); A myA = myB; myA.Fun1(); A* pA = &myB; pA->Fun1(); return 0; } что будет на экране консоли ? BBAB, ABAB, BBBB ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2005, 17:55
|
|||
|---|---|---|---|
Производные классы в C++ |
|||
|
#18+
Davyd Хотелось бы, чтобы myB.UseFun1(); использовала B::Fun1(), а не A::Fun1() Простое объявление A::Fun1() как виртуальной, увы, здесь не помогает :( Почему не помогает? Что вы там такое курите то? :)) Посмотрите мой вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2005, 17:57
|
|||
|---|---|---|---|
Производные классы в C++ |
|||
|
#18+
а чисто виртуальный метод не катит уже ? (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2005, 18:05
|
|||
|---|---|---|---|
Производные классы в C++ |
|||
|
#18+
да и не чистый - прокатит... тут правильно было выше сказано... ик.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2005, 18:19
|
|||
|---|---|---|---|
|
|||
Производные классы в C++ |
|||
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Ну вот теперь всё и прояснилось :) Всем БОЛЬШОЕ спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2005, 18:24
|
|||
|---|---|---|---|
Производные классы в C++ |
|||
|
#18+
Davyd Код: plaintext 1. 2. 3. 4. 5. Ну вот теперь всё и прояснилось :) Всем БОЛЬШОЕ спасибо! Это какой же у вас компилятор? Название и версия? Просто во втором virtual необходимости нет. Если метод объявлен virtual в базовом классе, то в производных это слово можно опустить. Хотя, лучше писать для наглядности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2005, 18:32
|
|||
|---|---|---|---|
|
|||
Производные классы в C++ |
|||
|
#18+
redskin Это какой же у вас компилятор? Название и версия? Просто во втором virtual необходимости нет. Если метод объявлен virtual в базовом классе, то в производных это слово можно опустить. Хотя, лучше писать для наглядности. MS VC++7 Ммда... А отличия, похоже, действительно заключались только в отсутствии virtual в производном классе... Или я что-то упустил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2005, 18:54
|
|||
|---|---|---|---|
|
|||
Производные классы в C++ |
|||
|
#18+
У меня есть подозрения... А существенно ли, если f() - конструктор? Т.е. проблема выглядела так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Что же делать в этом случае, если требуется в конструкторе B вызывать B::g()? Дело в том, что g() участвует в инициализации объекта и некоторым образом входит в конструктор. Неужели переписывать весь конструктор B::B()? Ведь отличия заключаются только в g()... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2005, 19:26
|
|||
|---|---|---|---|
Производные классы в C++ |
|||
|
#18+
Davyd Что же делать в этом случае, если требуется в конструкторе B вызывать B::g()? Дело в том, что g() участвует в инициализации объекта и некоторым образом входит в конструктор. Неужели переписывать весь конструктор B::B()? Ведь отличия заключаются только в g()... AFAIK, так делать нельзя. Если дизайн подразумевает какую-то сложную инициализацию на конструкторе с вызовом виртуальных методов, то... лучше поменять дизайн :) Можно просто вынести из конструктора общий код в какую-нибудь функцию, (обзовем ее Init), которую вызывать сразу после создания объекта. Либо сделать еще лучше и вдобавок сделать сам конструктор закрытым, а создание объектов выполнять через специальную функцию. (В умных книжках их обычно называют "фабриками класса" или "виртуальными конструкторами") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2005, 21:42
|
|||
|---|---|---|---|
Производные классы в C++ |
|||
|
#18+
Виртуальные функции называются. Сделай функцию виртуальной и используй. Только не используй в конструкторах и деструкторах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2005, 21:45
|
|||
|---|---|---|---|
Производные классы в C++ |
|||
|
#18+
redskin3) Если объекты создаются на стеке, а не динамически, то и виртуальность в нашем случае мало поможет Скажи пожалуйста, как поведение перегруженных/переопределенных/виртуальных функций зависит от того, как создан объект ? Никак она от этого не зависит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2005, 21:52
|
|||
|---|---|---|---|
Производные классы в C++ |
|||
|
#18+
DavydУ меня есть подозрения... А существенно ли, если f() - конструктор? Т.е. проблема выглядела так: Да. Или если деструктор. Прочитай как работают виртуальные методы в конструкторах и деструкторах. Davyd Что же делать в этом случае, если требуется в конструкторе B вызывать B::g()? Дело в том, что g() участвует в инициализации объекта и некоторым образом входит в конструктор. Неужели переписывать весь конструктор B::B()? Ведь отличия заключаются только в g()... Нет. Надо вынести код создания в отдельный метод инициализации. А в конструкторе только создавать объекты и инициализировать поля. Даже такой pattern есть для реализации такой штуки - Factory Method. (Если знаешь MFC , там нечно подобное делает класс CDocTemplate и его наследники). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2005, 23:00
|
|||
|---|---|---|---|
Производные классы в C++ |
|||
|
#18+
MasterZiv redskin3) Если объекты создаются на стеке, а не динамически, то и виртуальность в нашем случае мало поможет Скажи пожалуйста, как поведение перегруженных/переопределенных/виртуальных функций зависит от того, как создан объект ? Никак она от этого не зависит. Я ж написал, в следующем сообщении, что дал маху с этим пунктом :-\ Что и подвердил куском кода... Что еще не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=57&tablet=1&tid=2033073]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
99ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
74ms |
get tp. blocked users: |
2ms |
| others: | 241ms |
| total: | 471ms |

| 0 / 0 |
