![]() |
|
Модераторы: bsa |
![]()
|
|
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 1 Всего: 10 |
Есть статическая функция, своего рода конструктор, который создает обьект. Она обращается к абстрактному методу обьекта, который определяется в классе наследнике.
Она должна наследоваться, и уметь вызывать этот метод. Подстажите, как ее нужно реализовать, правильно ли я понимаю, только через шаблон? Это сообщение отредактировал(а) Logo - 14.3.2012, 16:58 |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
если объект есть, то полиморфизм будет работать. Добавлено через 53 секунды
однако если эта функция сама создает объект, она знает все про тип в момент компиляции Добавлено через 5 минут и 30 секунд http://codepad.org/IJ77LkRS |
|||
|
||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 1 Всего: 10 |
В примере в явно задается тип унаследованого сласса, а класов, наследующих базовый класс несколько.
|
|||
|
||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 1 Всего: 10 |
Тоесть, нужна такая архитектура
|
|||
|
||||
| Severyanin |
|
|||
![]() Исследователь ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 31.7.2007 Где: Россия, Омск Репутация: нет Всего: 9 |
Можно создавать экземпляр родительского класса, а потом в наследнике приводить его явно к классу этого наследника
-------------------- "Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл "Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
что должна возвращать эта функция ? должна ли она знать о наследниках ? если ответ на второй вопрос - да - то это вообще неправильно. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Такая не получится. А вот такая - получится:
|
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
кажется, ТС интересует прежде всего
видимо подразумевается переопределение в дочерних классах и полиморфное поведение. увы, весь полиморфизм такого рода возможен только на стадии компиляции. туплю но то же самое можно сделать проще и понятней: просто поместите код createObject() в конструктор, а при необходимости управлять размещением переопределите operator new() Это сообщение отредактировал(а) baldina - 15.3.2012, 11:02 |
|||
|
||||
| Logo |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 1 Всего: 10 |
Указатель на созданый обьект, как уже написал. Должна знать о его типе, а также о некоторых полях, которые как бэ абстрактные. Что тут неправильного?
Да, может быть оператор replacement new будет самым подходящим решением. Либо родительский класс будет на основе шаблона, надо хорошо обдумать... Функция как раз принимает параметры, на основе которых вычисляет размещение обьекта в памяти, и возвращает указатель на него. Правда есть еще другая типа void функция, которая делает тоже самое (вызывает эту функцию), только еще вызывает метод обьекта, который определен как раз в наследниках, и обрабатывает область памяти. Хотя может и ну ее (new(myParams) Object)->run(myParams) не слишком усложнит код, тоже вариант... |
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Logo |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 1 Всего: 10 |
Ага, хрен... конструктор должен обращатся к статическим виртуальным полям, которые определены в наследниках, однако нельзя определить поле одновременно статическим и виртуальным... видно без шаблона все равно не обойтись.
Например виртуальные методы. |
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Не понял. Я так понимаю: у базового класса есть свои виртуальные методы. О них обязан знать наследник. А вот чтобы базовый что-то знал о наследнике - ерунда какая-то... не понимаю. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
пока работает конструктор, объект не создан полностью, и к виртуальным функциям обращаться нельзя. это и не нужно, т.к. конструктор и так всегда знает, какой тип он конструирует. точно так же об этом знает любая функция, создающая объект. когда объект создан полностью, его тип не важен, т.к. доступны виртуальные методы. и вообще, см. паттерн factory. |
|||
|
||||
| Logo |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 1 Всего: 10 |
Нужно обращатся к абстрактным статическим полям. Которые к сожалению не поддерживаются. Тоесть опять возвращаемся к шаблонам, с помощью которых можно их эмулировать.
|
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Logo, а что в конце из этого статически виртуального винегрета должно получиться то ?
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |