![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| scarlett |
|
|||
|
Unregistered |
Подскажите пожалуйста, почему виртуальный конструктор не имеет смысла, а виртуальный деструктор - это хорошо.
|
|||
|
||||
| Alexey Dejneka |
|
|||
|
Unregistered |
В Objective C
|
|||
|
||||
| adejneka |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 8.7.2005 Где: Москва, Россия Репутация: нет Всего: 11 |
В Objective C и CLOS конструкторы виртуальные, но они принадлежат метаклассам.
В C++ нет (не было?) объектов-классов, соответственно, послать сообщение "создать экземпляр" некому. |
|||
|
||||
| chaos |
|
||||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
виртуальный конструктор не имеет смысла тк при создании объекта необходимо знать сколько места под него выделять а виртуальный деструктор правельно освободит место занимаемое объектом(при наследовании) вот еще можешь почитать про вк
Джефф Элджер C++ БИБЛИОТЕКА ПРОГРАММИСТА Это сообщение отредактировал(а) chaos - 8.7.2005, 07:50 |
||||
|
|||||
| Chaos A.D. |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 16.1.2005 Где: 09 RUS Репутация: 6 Всего: 7 |
Весь прикол в том, что в С++ статическая система типов. Тут нет объектов классов. Для того, чтобы создать объект, оператор new должен знать тип объекта, который нужно создать. Статическая типизация - одна из причин эффективности С++. Тем не менее, в С++, как всегда, найдется обходной путь (:. Языковые средства не поддерживают виртуальных конструкторов, как тут было сказано, но это не значит, что их суть нельзя выразить на С++. chaos приводил пример из книги. Но это не столько виртуальный конструктор, сколько хитрое использование оператора размещения ( new(void*)(...) ). К настоящим виртуальным конструкторам по принципу действия приближаются фабрики объектов. Они основаны на диспетчеризации вызовов функций, которые создают объекты разных типов. Таким образом, если отображать идентификатор типа в тип, можно создавать объекты этого типа по этому идентификатору. Идентификатором может быть строковое представление названия класса, или еще что-нибудь. Если говорить менее пафосно - можно замутить ассоциацию строки, скажем "Foo" с функцией или объектом, который создает объект класса Foo. И все в таком же духе. Вот это уже больше похоже на виртуальные функции. Ну а главная польза от них заключается, на мой взгляд, в повышении масштабируемости, и увеличении модульности. Вот так.
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest |
|||
|
||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
Это сообщение отредактировал(а) np9mi7 - 8.7.2005, 08:23 |
|||
|
||||
| Chaos A.D. |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 16.1.2005 Где: 09 RUS Репутация: 6 Всего: 7 |
Бывает и так... Например, говоришь фабрике объектов - дай мне такой widget, который был, когда я сохранял его в файл. Тогда компилер смотрит в файл, видит там идентификатор виджета, и возвращает настоящий виджет, производный от абстрактного Widget. Это, конечно, не совсем "дай мне то не знаю что", но очень похоже. Примерно, как "Дай мне что-то, похожее на это. И чтоб еще то-то умело." --------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest |
|||
|
||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
ответ неполный обычный деструктор также правильно освобождает память при наследовании
-------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
| np9mi7 |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
а в фабрике у тебя что:
, так или иначе ты должен сказать кого создать
А если так:
, что вызывается без виртуальности? Это сообщение отредактировал(а) np9mi7 - 8.7.2005, 10:09 |
||||||||
|
|||||||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
По фабрике
http://forum.vingrad.ru/index.php?showtopi...indpost&p=60738
Для поддержки механизма полиморфизма Если полимофизм использовать не предполагается, то применение виртуальных функций (в том числе и деструкторов) излишние накладные расходы. -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Chaos A.D. |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 16.1.2005 Где: 09 RUS Репутация: 6 Всего: 7 |
Ну это ты уже придираешься --------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest |
|||
|
||||
| np9mi7 |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
Это сообщение отредактировал(а) np9mi7 - 9.7.2005, 13:25 |
||||||||
|
|||||||||
| Chaos A.D. |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 16.1.2005 Где: 09 RUS Репутация: 6 Всего: 7 |
Я бы реализовал фабрику с использованием ассоциативного массива, состоящего из пар "индекс типа"-"вызываемая сущность, создающая объект". Отлично подойдут функторы(обобщенные), или простые указатели на функции. Например, будучи проиндексированным строкой "Foo", массив вернул бы то, к чему можно применить оператор (), и получить указатель на класс Foo. Естесственно, Foo должен быть полиморфным, иначе вообще ни к чему фабрики использовать. По моему, да и не только по моему, нужно так.
Не, я против switch-а ничего лично не имею, однако оно основано на статических метках, и поэтому категорически запрещено к использованию в ОО программах. По поводу книги GoF - она издавалась в далеком 1995 году; с тех пор концепции объектно-ориентированного программирования претерпели значительные изменения. С введением в стандарт языка такой вещи, как шаблонов, появилась возможность выражать алгоритмы и концепции независимо от типов, с которыми предполагается её использовать. Конечно, фабрика, основанная на switch-конструкциях, все-же фабрика, однако, крайне немасштабируема. Гамма использовал switch наверное потому, что тогда шаблоны были только-только включены в стандарт. Кстати, товарищ Александреску выразил все паттерны из книги независимо от типов, за что ему респект от всей программистской братии. Советую обратить внимание на библиотеку Loki. Это сообщение отредактировал(а) Chaos A.D. - 11.7.2005, 07:20 --------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest |
||||
|
|||||
| Vyacheslav |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Это как раз и отличает визарды от программистов. Первые как правило работают бездумно
Полиморфизм - "имеющий много форм". Применительно к ООП, это означает способность объектов выбирать метод на основе реального типа объекта при обращении к нему как к некоторому общему интерфейсу. Так что этот пример - типичный пример использования полиморфизма. А вот этот нет( здесь программист сам указывает какой деструктор нужно вызвать)
Но и при этом разрушение дочернего объекта будет корректным даже, если деструктор был невиртуальный. Так что ответ, что виртуальные деструкторы нужны для правильного разрушения производного класса, не совсем верен, ибо это обеспечивает и обычный деструктор. Виртуальный деструктор предназначен для корректного разрушения объекта при применении полиморфизма. и следовательно, как и виртуальные функции предназначен для поддержки последнего. -------------------- С уважением, Вячеслав Ермолаев |
||||||||
|
|||||||||
| np9mi7 |
|
||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
1) индексирования по массиву; 2) обращения к VT; длиться быстрее чем switch? Недором ведь switch можно делать только по встроенным типам....
Это сообщение отредактировал(а) np9mi7 - 12.7.2005, 11:10 |
||||||||||||
|
|||||||||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |