Для чего нужен виртуальный конструктор
Виртуальный конструктор в C++
Как известно, в языке программирования C++ нет прямой поддержки виртуального конструктора, однако, существует идиома, с помощью которой можно имитировать его работу. Прежде чем ее рассматривать, попробуем понять, каким поведением должен обладать виртуальный конструктор.
Для начала вспомним, что дает использование виртуальных функций. Механизм полиморфизма на базе виртуальных функций и наследования позволяет автоматически направлять вызовы производным классам, ничего о них не зная. Если у пользователя есть указатель на базовый класс, значением которого является адрес объекта производного класса, то для вызова некоторого метода производного класса пользователю достаточно знать об интерфейсе базового класса.
Однако, подобное поведение «ломается» непосредственно при создании объектов производных классов, а именно, при присваивании значению указателя на базовый класс адреса объекта производного класса обязательно нужно указывать этот производный класс. Наличие виртуального конструктора позволило бы клиентам с помощью конструктора базового класса создавать объекты производных классов, ничего не зная об их конкретных типах.
Фабричные методы, например, на базе обобщенного конструктора (паттерны Factory Method и Prototype), также предназначены для создания объектов без указания их конкретных типов, однако их поведение отлично от поведения виртуального конструктора.
Идиома, описанная Джеймсом Коплиеном, позволяет имитировать работу виртуального конструктора. Для этого она использует парадигму конверта, в котором лежит письмо. Класс конверта представляет собой базовый класс, содержащий указатель на объект того же базового типа. На практике этот указатель будет указывать на письмо, то есть объект некоторого производного класса. Когда клиент хочет создать объект некоторого типа, то он должен передать идентификатор этого типа в конструктор класса конверта. На основании этого идентификатора конструктор создает в куче объект соответствующего производного класса, адрес которого становится значением указателя на письмо. В дальнейшем все запросы от пользователя перенаправляются конвертом в письмо.
Рассмотрим реализацию идиомы виртуального конструктора на примере порождения воинов для стратегической игры «Пунические войны», описание которой можно найти в разделе Порождающие паттерны. Для простоты будем создавать военные персонажи для некоторой абстрактной армии без учета особенностей воюющих сторон.
Рассмотрим особенности реализации идиомы виртуального конструктора:
Для чего нужен виртуальный конструктор
Здравствуйте Lummox, Вы писали:
L>Что такое и с чем едят виртуальные методы понятно, но совершенно не понятно назначение виртуальных конструкторов с деструкторами. Так же не понятна технология их использования, ведь не может же производный класс иметь имя идентичное имени предка.
С виртуальными деструкторами проще — они нужны, чтобы объект, адресуесый указателем на базовый класс, корректно уничтожался. Например:
Если не объявить деструктор виртуальным, то в строке delete ptr; вызовется только деструктор класса A (которому соответствует тип указателя ptr), и память, выделенная под B::buf, останется неосвобождённой.
Вопрос про виртуальные конструкторы более интересен. Дело в том, что в C++ таких конструкторов не существует. «Виртуальный конструктор» — это скорее паттерн ООП, который легко реализовать на C++. Его ещё называют фабричным методом. Виртуальный конструктор — это виртуальный метод, который определяет интерфейс для создания некоторого объекта, но оставляет её реализацию классам-потомкам. Типичное применение этого паттерна — клонирование объектов, тип которых неизвестен на этапе компиляции.
В этом примере Clone можно назвать виртуальным конструктором. Использовать его гораздо удобнее, чем определять тип объекта, адресуемого ptr, через RTTI, а затем создавать нужную копию в switch’е. Кроме того, такое решение оказывается более гибким и лучше соответствует идеалам ООП.
| От: | Кривенко Антон Владимирович |
Дата: | 07.01.02 17:52 | |
Оценка: |
Здравствуйте Lummox, Вы писали:
L>Что такое и с чем едят виртуальные методы понятно, но совершенно не понятно назначение виртуальных конструкторов с деструкторами. Так же не понятна технология их использования, ведь не может же производный класс иметь имя идентичное имени предка.
Ух ты :))) А где это есть виртуальные конструкторы? Они и так в некотором роде виртуальные 🙂 В конструкторе происходит заполнение виртуальной таблицы. Кроме того, при вызове конструктора потомка всегда перед ним вызовется конструктор предка.
Ну а в деструкторе вот какой смысл. Если он не виртуальный, то при вызове деструктора потомка деструктор предка НЕ будет вызван. Иначе — будет вызван после потомка.
| От: | Кривенко Антон Владимирович |
Дата: | 07.01.02 17:54 | |
Оценка: |
| От: | Аноним |
Дата: | 07.01.02 17:59 | |
Оценка: |
Смысла в виртуальном конструкторе нет, как мне кажется, а вот виртуальные деструкторы — полезная штука при наследовании классов. Вируальным деструктор объявляется только в базовом классе, во всех наследуемых классах деструктор будет виртуальным по умолчанию. Виртуальный д. гарантирует, что все необходимые деструкторы для объекта такого класса будут вызваны, каким бы образом ты не вызывал для него delete. Особенно это показательно, когда создаешь массив типа базового класса, который фактически содержит указатели на объекты разных производних классов. По завершению работы нужно очистить память — вот для каждого такого указателя вызываешь delete, хотя указатель и типа базового класса, для соотв. обекта вызовуться деструкторы в обратном порядке тому, в котором вызывались конструкторы, для всех классов иерархии.
| От: | ZORK | www.zorkaltsev.com |
Дата: | 07.01.02 23:12 | ||
Оценка: |
Здравствуйте Alexander Shargin, Вы писали:
AS>Вопрос про виртуальные конструкторы более интересен. Дело в том, что в C++ таких конструкторов не существует. «Виртуальный конструктор» — это скорее паттерн ООП, который легко реализовать на C++. Его ещё называют фабричным методом. Виртуальный конструктор — это виртуальный метод, который определяет интерфейс для создания некоторого объекта, но оставляет её реализацию классам-потомкам. Типичное применение этого паттерна — клонирование объектов, тип которых неизвестен на этапе компиляции.
AS>
AS>В этом примере Clone можно назвать виртуальным конструктором. Использовать его гораздо удобнее, чем определять тип объекта, адресуемого ptr, через RTTI, а затем создавать нужную копию в switch’е. Кроме того, такое решение оказывается более гибким и лучше соответствует идеалам ООП.
Хотелось бы уточнить, что клонирование и фабрика и всеж таки две разные вещи. Приведенный пример, это клонирование. А абстрактная фабрика, это отдельный класс, который умеет создавать экземпляры объектов, и наличие этой абстрактной фабрики позволяет инкапсулировать способ создания конкретных экземпляров. Простейший пример:
Кстати, тут — http://www1.bell-labs.com/user/cope/Patterns/C%2b%2bIdioms/EuroPLoP98.html#VirtualConstructor есть что-то под название Виртуальные конструкторы, но в конечном итоге там все сводится к abstract factory паттерну.
| От: | Alexander Shargin | RSDN.ru |
Дата: | 07.01.02 23:30 | ||
Оценка: |
Здравствуйте ZORK, Вы писали:
AS>>В этом примере Clone можно назвать виртуальным конструктором. Использовать его гораздо удобнее, чем определять тип объекта, адресуемого ptr, через RTTI, а затем создавать нужную копию в switch’е. Кроме того, такое решение оказывается более гибким и лучше соответствует идеалам ООП.
ZORK>Хотелось бы уточнить, что клонирование и фабрика и всеж таки две разные вещи. Приведенный пример, это клонирование. А абстрактная фабрика, это отдельный класс, который умеет создавать экземпляры объектов, и наличие этой абстрактной фабрики позволяет инкапсулировать способ создания конкретных экземпляров. Простейший пример:
Я говорил не о фабрике, а о фабричном методе. Это два совершенно разных паттерна, хотя они и применяются для схожих целей. Кстати, применение фабричного метода (то бишь виртуального конструктора) не ограничивается клонированием. Например, в класс окна можно ввести виртуальные методы CreateMenu, CreateBorder, CreateCaption и пр., которые пользователь может переопределять в производных классах для придания окну нестандартного вида. И они также будут являться фабричными методами.
| От: | ZORK | www.zorkaltsev.com |
Дата: | 08.01.02 00:00 | ||
Оценка: | 2 (1) |
Здравствуйте Alexander Shargin, Вы писали:
AS>Здравствуйте ZORK, Вы писали:
AS>>>В этом примере Clone можно назвать виртуальным конструктором. Использовать его гораздо удобнее, чем определять тип объекта, адресуемого ptr, через RTTI, а затем создавать нужную копию в switch’е. Кроме того, такое решение оказывается более гибким и лучше соответствует идеалам ООП.
ZORK>>Хотелось бы уточнить, что клонирование и фабрика и всеж таки две разные вещи. Приведенный пример, это клонирование. А абстрактная фабрика, это отдельный класс, который умеет создавать экземпляры объектов, и наличие этой абстрактной фабрики позволяет инкапсулировать способ создания конкретных экземпляров. Простейший пример:
AS>Я говорил не о фабрике, а о фабричном методе. Это два совершенно разных паттерна, хотя они и применяются для схожих целей. Кстати, применение фабричного метода (то бишь виртуального конструктора) не ограничивается клонированием. Например, в класс окна можно ввести виртуальные методы CreateMenu, CreateBorder, CreateCaption и пр., которые пользователь может переопределять в производных классах для придания окну нестандартного вида. И они также будут являться фабричными методами.
Понятно, то есть речь о Factory Method (http://rampages.onramp.net/
huston/dp/factoryMethod.html) — Виноват!-) Всеж таки, как мне кажется, клонирование это не самый удачный пример, так как он больше демонстрирует Prototype Pattern, а вот CreateWhatever() — это действительно хорошая демонстрация Factory Methods
| От: | Alexander Shargin | RSDN.ru |
Дата: | 08.01.02 00:15 | ||
Оценка: |
huston/dp/factoryMethod.html) — Виноват!-) Всеж таки, как мне кажется, клонирование это не самый удачный пример, так как он больше демонстрирует Prototype Pattern, а вот CreateWhatever() — это действительно хорошая демонстрация Factory Methods
Действительно, метод Clone имеет большое значение для паттерна «Прототип», но его применение гораздо шире. В том примере, который я приводил, не ничего похожего на набор прототипов или реестр прототипов для конструирования объектов. Есть только метод Clone. И он вполне подходит под определение виртуального конструктора, так как: а) виртуален и б) создаёт объекты.
А насчёт неудачности примера могу согласиться — он получился на стыке паттернов, что порожджает некоторую путаницу. Собственно, меня сбил с истинного пути Страуструп, который, насколько я помню, тоже демонстрировал метод Clone в разделе, посвящённом виртуальным конструкторам. Точнее не скажу, так как отдал Страуструпа на прочтение.
Конспект по дисциплине Программирование С++ на тему «Виртуальные конструкторы»
Для того чтобы создать объект, конструктор должен знать его точный тип. Следовательно, конструктор не может быть виртуальным. Более того, конструктор является не совсем обычной функцией. В частности, он взаимодействует с процедурами управления памятью способом, недоступным обычным функциям-членам класса. Как следствие, невозможно получить указатель на конструктор.
Оба ограничения можно обойти, определив функцию, которая вызывает конструктор и возвращает созданный объект.
virtual Base* Create()
virtual Base* Clone()
// Создание нового объекта
Так как функции вроде Create() и Clone() являются виртуальными и создают (косвенно) объекты, их часто называют « виртуальными конструкторами ». Однако на самом деле они не являются конструкторами в обычном понимании, просто каждая из них использует конструктор для создания подходящего объекта.
class Derived : public Base
Derived( const Derived& d);
Теперь имея объект класса Base или производного от него класса, можно создать новый объект такого же типа.
Курс повышения квалификации
Дистанционное обучение как современный формат преподавания
Курс повышения квалификации
Педагогическая деятельность в контексте профессионального стандарта педагога и ФГОС
Курс повышения квалификации
Современные педтехнологии в деятельности учителя
Ищем педагогов в команду «Инфоурок»
Номер материала: ДБ-1493063
Не нашли то что искали?
Вам будут интересны эти курсы:
Оставьте свой комментарий
Авторизуйтесь, чтобы задавать вопросы.
Учителя о ЕГЭ: секреты успешной подготовки
Время чтения: 11 минут
В России утвердили новый порядок формирования федерального перечня учебников
Время чтения: 1 минута
Онлайн-конференция о профориентации и перспективах рынка труда
Время чтения: 3 минуты
Путин поручил не считать выплаты за классное руководство в средней зарплате
Время чтения: 1 минута
Пик использования смартфонов приходится на 16 лет
Время чтения: 1 минута
В Москве новогодние каникулы в школах могут начаться с 27 декабря
Время чтения: 1 минута
Учителям предлагают 1,5 миллиона рублей за переезд в Златоуст
Время чтения: 1 минута
Подарочные сертификаты
Ответственность за разрешение любых спорных моментов, касающихся самих материалов и их содержания, берут на себя пользователи, разместившие материал на сайте. Однако администрация сайта готова оказать всяческую поддержку в решении любых вопросов, связанных с работой и содержанием сайта. Если Вы заметили, что на данном сайте незаконно используются материалы, сообщите об этом администрации сайта через форму обратной связи.
Все материалы, размещенные на сайте, созданы авторами сайта либо размещены пользователями сайта и представлены на сайте исключительно для ознакомления. Авторские права на материалы принадлежат их законным авторам. Частичное или полное копирование материалов сайта без письменного разрешения администрации сайта запрещено! Мнение администрации может не совпадать с точкой зрения авторов.
Виртуальный конструктор
Преимущества использования виртуальных конструкторов над формальным решением задач. Виды виртуальных конструкторов. Развитие творческих способностей обучаемого, путем создания благоприятной среды, исследуя которую обучаемый приобретает нужные знания.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | реферат |
Язык | русский |
Дата добавления | 20.05.2009 |
Размер файла | 20,3 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
В школьных учебниках и пособиях понятия и явления объясняются довольно абстрактно, в них не хватает наглядности, что приводит к механическому зазубриванию материала. Виртуальный конструктор решает данную проблему.
1. Понятие «Виртуальный конструктор»
Обучение при использовании виртуальных конструкторов становится более интерактивным. Интерактивное обучение основано на прямом взаимодействии учащихся (обучаемых) с учебным окружением. Учебное окружение, или учебная среда, выступает как реальность, в которой участники находят для себя область осваиваемого опыта.
· во-первых, они должны быть доступными учащимся и соответствовать их уровню знаний и мышления;
· во-вторых, они должны быть воспроизводимыми и соответственно представлять все системные связи и отношения;
Как дополнительные средства обучения компьютерные технологии имеют много преимуществ перед обычными средствами (учебниками): в полной мере реализуют деятельностный подход, обеспечивая оперативность исполнения любого запроса к системе и реализации обратной связи, а также не только выдачу в реальном режиме работы результатов (оценки) деятельности ученика, но и возможность мгновенного исправления допущенных ошибок в серии попыток. Это и позволяет учителю, освободившись тем самым от рутинных забот, сосредоточиться на базовых проблемах обучения и системного восприятия обучаемыми его содержания, реализуя технологии индивидуального подхода в обучении.
3. Основные виды виртуальных конструкторов
Система направлена на развитие конкретного и абстрактного мышления у детей, формирование творческих компонентов деятельности. Элкон может использоваться при изучении конструкторской деятельности, при изучении и исследовании множеств с различной структурной организацией, для формирования авторского мышления, эстетического воспитания и т.п.
Применение системы возможно практически в любых предметных областях, включая орнаментальное искусство, историю, географию, домоводство, дисциплины естественно-математического цикла. Система ориентирована на непрограммирующего пользователя. В среде Элкон могут работать дети, начиная с 5-6 лет.
В школьных учебниках и пособиях связи между понятиями одной дисциплины, как и междисциплинарные связи, не формулируются явно, что приводит к необходимости просто механически зазубривать учебный материал. Тем самым учащийся заучивает некоторую совокупность понятий часто без связи между ними, что не даёт целостного представления о предмете. Аналогично межпредметные и междисциплинарные связи остаются в тени. Происходит невосполнимое разрушение целого. В результате человек способен работать преимущественно на низких или средних уровнях принятия решений как в том, что касается его личной жизни, так и в профессиональной области.
При использовании АСКУН достигаются следующие цели:
изучение основной терминологической лексики предметной области и системы семантических связей между понятиями (тематическая и структурная ориентация);
формирование производных словарей (микротезаурусов) на базе основного тезауруса (функциональная ориентация);
ассоциативное усвоение элементов знаний изучаемой предметной области на основе многоаспектного использования словарной информации и графического изображения связей понятий (когнитивная ориентация).
Система Контур позволяет решить любую задачу данного класса из школьного курса стереометрии, условие задачи формируется в режиме диалога. Одновременно создаются графические модели исходных объектов. При решении задачи учащийся работает с реальными объектами предметной области (точкой, прямой, отрезком, плоскостью, многоугольником, многогранником), использует набор графических операций, ему доступны различные виды вращения фигуры, работа в оконной среде.
Система Контур направляет деятельность учащегося на решение задачи и независимо от него генерирует правильный ответ. Никаких готовых решений в систему заранее не заложено. Контрольно-оценочный этап возлагается на преподавателя. Статистическую информацию о работе учащегося можно посмотреть в протоколе системы. Учитель получает информацию о том, сколько раз учащийся менял своё решение при описании объектов предметной области; сколько сделано попыток повторного решения задачи после сравнения собственного ответа с ответом компьютера; исследовалась ли задача на наличие других решений (если да, то сколько раз); какое время было затрачено на создание формальной модели условия задачи; каково общее количество задач, решённых учащимся за один сеанс работы с системой.
Основные достоинства разработки:
построение формальной модели условия задачи;
возможность исследования задачи на наличие других решений;
приближение объекта к реальному, за счёт учёта свойств элементов многогранника;
идея конструктора задач;
использование тезауруса для работы с понятиями, в результате чего предоставляется возможность ставить оригинальные задачи по изучению предметной области и их моделированию на понятийном уровне.
Компьютерные учебные среды дают возможность учащемуся, решая, в том числе и стандартные, задачи, продемонстрировать нестандартность своего мышления. А сравнительный анализ полученных решений позволяет убедиться в многообразии существующих возможностей. В школе чаще всего, к сожалению, от ученика добиваются формального решения задачи. От него требуется с точностью до шага воспроизводить решение по шаблону.
Хотя опыт работы с виртуальными конструкторами пока не очень большой, но он показывает, что компьютерная поддержка творческой работы во всех направлениях востребована школой, и способна помочь как учителю, так и ученику.
Подобные документы
Управление электронным бизнесом. Изучение технологии создания сайта предприятия с использованием выбранных бесплатных конструкторов сайтов. Сравнительный анализ макетов сайтов, разработанных для организации с помощью конструкторов «Nethouse» и «А5».
курсовая работа [867,2 K], добавлен 23.03.2016
Понятия выставки, экспозиции и виртуальности. Их представительства в сети. Виртуальные выставки на службе экспобизнеса. Особенности их организаций. Техническая реализация виртуальных экспозиций. Примеры существующих виртуальных музеев в Интернет.
реферат [60,1 K], добавлен 25.11.2009
Понятие виртуального магазина. Преимущества и недостатки виртуальных магазинов. Классификация виртуальных магазинов. Организация деятельности виртуальных магазинов. Создание виртуальных магазинов. Способы оплаты в Интернет. Процессинговая система.
курсовая работа [72,0 K], добавлен 30.09.2007
Разработка модулей для автоматического развертывания виртуальных сред и технология их резервного копирования. Схемы сетевого взаимодействия виртуальных сред и их состав (настройка гостевых операционных систем и служб) для каждого из специалистов.
дипломная работа [3,7 M], добавлен 06.03.2013
Анализ современного рынка программных продуктов. Понятие виртуального тура и возможности его применения. Изучение программного обеспечения и технологии создания виртуальных туров. Панорамный снимок и виртуальная брошюра. Настройка параметров панорамы.
курсовая работа [3,5 M], добавлен 22.03.2016
Понятие виртуальных организаций (ВО), интероперабельность: техническое и программное обеспечение. Создание, управление и использование динамичных, межведомственных ВО. Описание грид-архитектуры ВО и ее компонентов. Интерфейсы локального управления.
реферат [89,8 K], добавлен 03.01.2012
Обзор существующий решений в области электронного обучения. Исследование архитектурных и технологических аспектов построения виртуальных корпоративных университетов. Анализ возможностей системы дистанционного обучения Sakai, отличительные особенности.
дипломная работа [2,7 M], добавлен 09.04.2011