|
|
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
Есть класс, которой содержит абстрактные методы, есть другой, который их реализует. Наиболее простой способ их склеивания Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. не прокатывает ибо: автор c.cpp:28: error: cannot declare variable `b' to be of type `B' c.cpp:28: error: because the following virtual functions are abstract: c.cpp:15: error: virtual void A1::a() Как элегантно решить эту проблему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2007, 16:47 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
Отнаследовать A2 от A1 не могу, т.к. в качестве A1 подставляется несколько классов, из них лепяться другие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2007, 16:53 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
Вообщем, прихожу к выводу, что все таки наследовать A2 нельзя. Прийдется его создавать совойством класса и связывать все виртуальные функции. Не красиво по моему. А если бы A2 имел абстрактные обвязки на A1? Такая схема, вообще, не возможна? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2007, 17:09 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
AkhЕсть класс, которой содержит абстрактные методы, есть другой, который их реализует. class B : virtual public A1, virtual public A2 { ... }; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2007, 18:03 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
MasterZiv AkhЕсть класс, которой содержит абстрактные методы, есть другой, который их реализует. class B : virtual public A1, virtual public A2 { ... }; ничего не поменялось: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2007, 18:12 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2007, 18:50 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
Точнее так: :) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2007, 18:52 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
А вариант не покатит: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2007, 21:12 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
Тынц.Точнее так: :) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Примерно так и делаю, но проблема описана во втором моем сообщении. У меня 4 разных A1 от одного интерфейса с 7-ю виртуальными методами. Необходимо получить 4 класса B. Приходится вводить 28 лишних функций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2007, 09:38 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
SnowMan2А вариант не покатит: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Нет. Так как классов A1 много. Все от одного интерфейса. Примерно так: Код: 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. Необходимо построить B1, ... Bn путем "скрещивания" A1x с A2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2007, 09:42 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
поскольку класс B абстрактный, нельзя создавать его объекты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2007, 15:19 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
maXmoпоскольку класс B абстрактный, нельзя создавать его объекты. А вставить функции из другого класса в абстрактные? Как элегантно решить эту проблему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2007, 15:21 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
у ты какой. А может, их надо оставить абстрактными? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2007, 15:29 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
maXmoу ты какой. А может, их надо оставить абстрактными? Я хочу их подменить из другого класса. Есть объекты A1x. Выполняют некоторую логику. Им надо ее как-то проявить. Проявить можно по разному, например через A21. А можно и по другому, например через A22 или A23, ... . Соответственно можно их склеивать в B11_21, и т.д. Но как их склеить не прописывая каждый раз ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2007, 15:45 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
хм… а this им какой передавать? A21 требует указатель на А21, А22 – на А22, а ты хочешь метод А21 подменить методом А22, а они не взаимозаменяемы (получится, что ты применяешь метод А22 к А21). Низя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2007, 15:58 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
В конструкции Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2007, 16:05 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
maXmoхм… а this им какой передавать? A21 требует указатель на А21, А22 – на А22, а ты хочешь метод А21 подменить методом А22, а они не взаимозаменяемы (получится, что ты применяешь метод А22 к А21). Низя. Почему не взаимозаменяемы? Что это значит? Может мы друг друга не понимаем? Классы A1x - с абстрактными метордами, A2x - с реализацией этих методов. Я хочу применить методы A2x, подменив ими методы из A1x. Путем множественного наследования получается единственная реализация метода. Из A1x берется абстрактный метод (необходимо его реализовать), из A2x берется реализация (конкретная реализация). Путем разных комбинаций предков из наборов A1x и A2x получаются разные классы комбинируя между собой некотороую логику и по разному проявляя свои результаты. Количество этих классов - произведение количества наборов классов A1x и A2x. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2007, 16:29 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
LeonMВ конструкции Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. А реализация A2::a()? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2007, 16:30 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
Классы A1x - с абстрактными метордами, A2x - с реализацией этих методов. если A1x представляет интерфейс A2x, то логично наследование A2x->A1x далее B наследует A2x и т.д. это классическая схема разделения интерфейса и реализации, а что вы пытаетесь изобрести малопонятно - нужен содержательный пример ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2007, 16:39 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
А так ? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2007, 16:41 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
Голенков Владимир Классы A1x - с абстрактными метордами, A2x - с реализацией этих методов. если A1x представляет интерфейс A2x, то логично наследование A2x->A1x далее B наследует A2x и т.д. это классическая схема разделения интерфейса и реализации, а что вы пытаетесь изобрести малопонятно - нужен содержательный пример Класс A0 - интерфейс Классы A1x - реализация интерфесов A0, которые собой представляют новые интерфейсы. 3 из них имеют 4 абстактных метода, и один - теже 4 + еще 3 метода. Классы A2x - классы реализующие эти методы. Фактически Классы A1x - разные интерфейсы, но отличаются только количеством необходимых функций из некоторой области. Т.е. можно сказать из некоторого обширного интерфейса. Но для некоторых классов полная реализация всех области функций не нужна. Хочу найти простое (красивое, элегантное, ...) средство наложения функций из некоторого класса на абстрактные функции из классов (интерфейсов) A1x. Причем этот некоторый класс A2n может применяться несколько раз, столько сколько необходимо организовать с его учатстием склеек с классами A1n. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2007, 16:49 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
BarloneА так ? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. С виду гениально! Надо попробовать. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2007, 16:50 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
AkhХочу найти простое (красивое, элегантное, ...) средство наложения функций из некоторого класса на абстрактные функции из классов (интерфейсов) A1x. Причем этот некоторый класс A2n может применяться несколько раз, столько сколько необходимо организовать с его учатстием склеек с классами A1n.Шаблоны :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2007, 16:52 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
Barlone AkhХочу найти простое (красивое, элегантное, ...) средство наложения функций из некоторого класса на абстрактные функции из классов (интерфейсов) A1x. Причем этот некоторый класс A2n может применяться несколько раз, столько сколько необходимо организовать с его учатстием склеек с классами A1n.Шаблоны :) Да. Действительно. Знал, что должно быть решение, но слона не заметил. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2007, 17:49 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
Akh пишет: > class A1 { > protected: > virtual void a() = 0; > }; > > template <class T> class A2 : public T { > protected: > virtual void a() {}; > }; > С виду гениально! Это только с виду. А так - дебилизм. Зачем нужен шаблон, если он не использует своего параметра ? Дело в том, что в исходно предложенной реализации классы A1 и A2 оба имеют РАЗНЫЕ методы virtual void a() и A2 НЕ ПЕРЕОПРЕДЕЛЯЕТ метод из A1, а создает свой собственный. Потому что A2 не является наследником A1, т.е. вообще ничего не знает о A1. Для того чтобы A2 реализовал (переопределял) методы A1, он должен быть унаследован от A1 : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2007, 12:47 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
MasterZivПотому что A2 не является наследником A1как так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2007, 12:52 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
MasterZiv Это только с виду. А так - дебилизм. Зачем нужен шаблон, если он не использует своего параметра ? Дело в том, что в исходно предложенной реализации классы A1 и A2 оба имеют РАЗНЫЕ методы virtual void a() и A2 НЕ ПЕРЕОПРЕДЕЛЯЕТ метод из A1, а создает свой собственный. Потому что A2 не является наследником A1, т.е. вообще ничего не знает о A1. Для того чтобы A2 реализовал (переопределял) методы A1, он должен быть унаследован от A1 : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. В этом и выявляется + который и дает в данном случае шаблон. Ты жестко прописал для A2 предка A1. Если сделать наследником некий другой A1~, то реализацию всего A2 надо копировать. Шаблон же автоматизирует эту работу. Мысля появилась. А если убрать шаблон и пронаследовать от в всех A1n? Что будет с одноименными методами в С++ при множественном наследование не знаю, но минус будет в том, что если добавиться новый A1x, то A2 прийдется измянть. Шаблон же автоматом все подцепит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2007, 13:11 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
MasterZiv Это только с виду. А так - дебилизм. Зачем нужен шаблон, если он не использует своего параметра ? Ась ? Как не использует ? Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2007, 15:59 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
А если убрать шаблон и пронаследовать от в всех A1n? Что будет с одноименными методами в С++ при множественном наследование не знаю, но минус будет в том, что если добавиться новый A1x, то A2 прийдется измянть. Шаблон же автоматом все подцепит. конфликты имен при множественном наследовании все равно придется разрешать явно кодированием так что шаблоны, без вариантов (если я правильно понял задачу) вот только я бы сделал через шаблон-генератор прокси (идеома PIMPL) как-то так: Код: 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. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. если что накосячил, извиняте - лепил наскоро указатель нужен "умный", со счетчиком ссылок ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2007, 20:44 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
Akh пишет: > В этом и выявляется + который и дает в данном случае шаблон. Ты жестко > прописал для A2 предка A1. Если сделать наследником некий другой A1~, то > реализацию всего A2 надо копировать. Шаблон же автоматизирует эту работу. > > Мысля появилась. Тут вообще не должно быть никаких мыслей. Тебе надо определить абстрактные методы - нужно наследование. Все. Если у тебя были какие-то другие мысли, они были неправильные. А если убрать шаблон и пронаследовать от в всех A1n? > Что будет с одноименными методами в С++ при множественном наследование > не знаю, но минус будет в том, что если добавиться новый A1x, то A2 > прийдется измянть. Шаблон же автоматом все подцепит. Голенков Владимир пишет: > конфликты имен при множественном наследовании все равно придется > разрешать явно кодированием Суть-то в том, что не нужно здесь множественное наследование. > так что шаблоны, без вариантов (если я правильно понял задачу) > вот только я бы сделал через шаблон-генератор прокси (идеома PIMPL) > как-то так: Какова задача ? "Есть класс, которой содержит абстрактные методы, есть другой, который их реализует. Наиболее простой способ их склеивания ..." Это реализуется наследованием реализующего класса от класса, объявляющего методы. Все остальные решения не соответствуют уровню сложности задачи. (она проста, а решения предлагаются сложные). Ну и вообще хочется спросит афтара - а что надо то вообще ? Нужно реализовать - наследуйся, какие проблемы ? Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2007, 13:40 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
Что-то я невнимательно читал топик. Действительно шаблоны нужны если надо реализовать методы разных базовых классов с помощью только одного. Но проблема еще и в том, что если написать template <class AI> class AIImpl: public AI { virtual void method1(...) { ... } virtual void method2(...) { ... } virtual void method3(...) { ... } }; то методы method1, method2, method3 в этом случае будут соотносится с методами базового класса только по названиям и сигнатурам. В любом случае каждый класс AI будет требовать только определенных методов (если их будет нехватать, AIImpl определит лишние, если будет много, то AIImpl-а будет недостаточно). Почему бы не написать для каждого класса AI свою имплементацию ? class AI1 { virtual void method1(...) =0; virtual void method2(...) =0; virtual void method3(...) =0; } class AI1Impl : public AI1 { virtual void method1(...){} virtual void method2(...){} virtual void method3(...){} } class AI2 { virtual void method3(...) =0; virtual void method4(...) =0; virtual void method5(...) =0; } class AI2Impl : public AI2 { virtual void method3(...){} virtual void method4(...){} virtual void method5(...){} } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2007, 13:55 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
Голенков Владимир... вот только я бы сделал через шаблон-генератор прокси (идеома PIMPL) ... В принципе, да. Как вариант. В моем случае не вижу смысла в, отделении волков от овец. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2007, 10:08 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
MasterZiv... Почему бы не написать для каждого класса AI свою имплементацию ? class AI1 { virtual void method1(...) =0; virtual void method2(...) =0; virtual void method3(...) =0; } class AI1Impl : public AI1 { virtual void method1(...){} virtual void method2(...){} virtual void method3(...){} } class AI2 { virtual void method3(...) =0; virtual void method4(...) =0; virtual void method5(...) =0; } class AI2Impl : public AI2 { virtual void method3(...){} virtual void method4(...){} virtual void method5(...){} } Потому-то просто копирование кода. Любое изменение (исправление глюка), повлечет за собой необходимость изменять все копии. Да и, вообще, не красиво, сложно, не интересно, не профессионально, ... . Я как раз с этим и борюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2007, 10:11 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
В принципе, да. Как вариант. В моем случае не вижу смысла в, отделении волков от овец. я пример привел с целью прояснения самой задачи, потому как честно говоря не въехал поначалу что к чему %) пара замечаний: 1) по-моему, в случае PIMPL плюсы (большее абстагирование, "легкое" копирование) превышают минусы (дополнительная косвеность вызовов методов) особенно в случае громоздкого класса реализации 2) в интерфейсах AI деструкторы нужно сделать защищенными во избежания соблазна delete AI ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2007, 11:34 |
|
||
|
Множественно наследование
|
|||
|---|---|---|---|
|
#18+
Голенков Владимир В принципе, да. Как вариант. В моем случае не вижу смысла в, отделении волков от овец. я пример привел с целью прояснения самой задачи, потому как честно говоря не въехал поначалу что к чему %) пара замечаний: 1) по-моему, в случае PIMPL плюсы (большее абстагирование, "легкое" копирование) превышают минусы (дополнительная косвеность вызовов методов) особенно в случае громоздкого класса реализации 2) в интерфейсах AI деструкторы нужно сделать защищенными во избежания соблазна delete AI Абсолютно согласен со всем. Единственное, планку в 1) я бы немного сдвинул. Один вопрос. Данная схема также использует наследование от шаблона. Статик каст, мне кажется не нужен. Использование более простое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2007, 11:48 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2029671]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
178ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 501ms |

| 0 / 0 |
