Что такое виртуальный конструктор

Обновлено: 19.04.2024

Преимущества использования виртуальных конструкторов над формальным решением задач. Виды виртуальных конструкторов. Развитие творческих способностей обучаемого, путем создания благоприятной среды, исследуя которую обучаемый приобретает нужные знания.

Рубрика Программирование, компьютеры и кибернетика
Вид реферат
Язык русский
Дата добавления 20.05.2009
Размер файла 20,3 K

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Введение

В настоящее время учебных виртуальных конструкторов (учебных сред) изобретено мало, хотя в условиях быстрой компьютеризации общества они приобретают все большую популярность. Их идея довольно проста. Можно дать ребенку возможность наблюдать за ходом физического эксперимента на экране компьютера, а можно позволить ему самому этот эксперимент ставить - расположить наклонные плоскости, гирьки, тележки, бильярдные шары, планеты Солнечной системы, электроны и пешеходов и посмотреть, что получиться. И не только посмотреть, но, если надо, получить все графики во всех осях координат и т. д. Сложна ли постановка виртуального эксперимента? Не сложнее, чем рассказ о ней и много проще, чем реальная постановка. Возможность постановки виртуального эксперимента, а, если нужно, и сотен и тысяч экспериментов, радикально меняет учебный процесс.

В школьных учебниках и пособиях понятия и явления объясняются довольно абстрактно, в них не хватает наглядности, что приводит к механическому зазубриванию материала. Виртуальный конструктор решает данную проблему.

Основная часть

1. Понятие «Виртуальный конструктор»

Виртуальный конструктор (учебная среда) - это образовательный электронный ресурс, позволяющий в рамках законов и правил, заданных предметной областью, строить модели и работать с ними в объектной технологии.

Глобальная педагогическая цель учебных сред - развитие творческих способностей обучаемого путем создания благоприятной среды, исследуя которую обучаемый приобретает нужные знания.

Обучение при использовании виртуальных конструкторов становится более интерактивным. Интерактивное обучение основано на прямом взаимодействии учащихся (обучаемых) с учебным окружением. Учебное окружение, или учебная среда, выступает как реальность, в которой участники находят для себя область осваиваемого опыта.

Если рассматривать интерактивное обучение глубже, то речь идет не просто о подключении эмпирических наблюдений, жизненных впечатлений учащихся в качестве вспомогательного материала, иллюстративного дополнения - опыт учащегося-участника служит центральным источником учебного познания.

2. Особенности учебных сред

Компьютерная информационная среда обучения содержит модели изучаемых знаний и является самостоятельным объектом обучения в варианте, возможном без участия учителя, реализуя парадигму: «ученик - учебная среда - технологии». Поскольку здесь информационные объекты не могут рассчитывать на их активизацию и воспроизведение учителем, то и требования к ним должны предъявляться другие, чем в системе «учитель - учебная среда - ученик»:

· во-первых, они должны быть доступными учащимся и соответствовать их уровню знаний и мышления;

· во-вторых, они должны быть воспроизводимыми и соответственно представлять все системные связи и отношения;

· - в-третьих, они должны содержать максимально возможное количество средств самоактивизации.

В этом, очевидно, большое преимущество компьютерных средств обучения. Их средства управления и пользовательского интерфейса обязаны соответствовать уровню искусственного интеллекта, возлагая на себя часть функций учителя. Таким образом, печатные и компьютерные средства в системе обучения «ученик - учебная среда - технологии» должны соответствовать системному подходу. Такой тип обучения может быть применим в средней школе, во-первых, в дифференцированной форме, а во-вторых, только как надстройка над базовой системой с учетом специфики и профильной направленности обучения. Разумеется, любые печатные и компьютерные средства могут использоваться в полной системе обучения в качестве дополнительных учебных пособий (помимо основных учебников). В этом случае они выступают в качестве иллюстративных аудиовизуальных средств или сборников экспериментального материала, и поэтому к ним не предъявляются никакие требования, кроме требований качества и соответствия целям обучения.

Как дополнительные средства обучения компьютерные технологии имеют много преимуществ перед обычными средствами (учебниками): в полной мере реализуют деятельностный подход, обеспечивая оперативность исполнения любого запроса к системе и реализации обратной связи, а также не только выдачу в реальном режиме работы результатов (оценки) деятельности ученика, но и возможность мгновенного исправления допущенных ошибок в серии попыток. Это и позволяет учителю, освободившись тем самым от рутинных забот, сосредоточиться на базовых проблемах обучения и системного восприятия обучаемыми его содержания, реализуя технологии индивидуального подхода в обучении.

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, отличительные особенности.

Все мы знаем, что в C++ нет такого понятия как виртуальный конструктор, который бы собирал нужный нам объект в зависимости от каких-либо входных параметров на этапе выполнения. Обычно для этих целей используется параметризованный фабричный метод (Factory Method). Однако мы можем сделать «ход конем» и сымитировать поведение виртуального конструктора с помощью методики, называемой «конверт и письмо» («Letter/Envelope»).

Не помню, где я об этом узнал, но, если я не ошибаюсь, такую технику предложил Джим Коплиен (aka James O. Coplien) в книге «Advanced C++ Programming Styles and Idioms».

Идея состоит в том, чтобы внутри базового класса (Конверта) хранить указатель на объект этого же типа (Письма). При этом Конверт должен «перенаправлять» вызовы виртуальных методов на Письмо. С хорошими примерами у меня, как всегда, небольшие проблемки, поэтому «промоделируем» систему магических техник (или заклинаний) =) Предположим, что для каждой техники используется один из пяти основных элементов (а может и их комбинация), от которых зависит воздействие этой техники на окружающий мир и на предмет, к которому она применяется. В то же время мы хотим иметь возможность работать со всеми техниками независимо от их типа.

Для этого создадим базовый класс Skill и производные от него для каждого из типов техник. В базовом классе, чисто для примера, определим три виртуальных метода для создания, отображения техники, а также для зачистки памяти после него.

using std :: cout ;
using std :: endl ;

enum
<
FIRE = 0x01 ,
WIND = 0x02 ,
LIGHTNING = 0x04 ,
SOIL = 0x08 ,
WATER = 0x10
> ;

class Skill // aka Jutsu =)
<
public :
// virtual (envelope) constructor (see below)
Skill ( int _type ) throw ( std :: logic_error ) ;

// destructor
virtual ~Skill ( )
<
if ( mLetter )
<
// virtual call in destructor!
erase ( ) ;
>

delete mLetter ; // delete Letter for Envelope
// delete 0 for Letter
>

virtual void cast ( ) const < mLetter - >cast ( ) ; >
virtual void show ( ) const < mLetter - >show ( ) ; >
virtual void erase ( ) < mLetter - >erase ( ) ; >

protected :
// letter constructor
Skill ( ) : mLetter ( NULL )

private :
Skill ( const Skill & ) ;
Skill & operator = ( Skill & ) ;

Skill * mLetter ; // pointer to letter
> ;


class FireSkill : public Skill
<
public :
~FireSkill ( ) < cout
virtual void cast ( ) const < cout
virtual void show ( ) const < cout
virtual void erase ( ) < cout
private :
friend class Skill ;
FireSkill ( ) < >
FireSkill ( const FireSkill & ) ;
FireSkill & operator = ( FireSkill & ) ;
> ;


class WoodSkill : public Skill
<
public :
~WoodSkill ( ) < cout
virtual void cast ( ) const < cout
virtual void show ( ) const < cout
virtual void erase ( ) < cout
private :
friend class Skill ;
WoodSkill ( ) < >
WoodSkill ( const WoodSkill & ) ;
WoodSkill & operator = ( WoodSkill & ) ;
> ;


Skill :: Skill ( int _type ) throw ( std :: logic_error )
<
switch ( _type )
<
case FIRE :
mLetter = new FireSkill ;
break ;

case SOIL | WATER :
mLetter = new WoodSkill ;
break ;

default :
throw std :: logic_error ( "Incorrect type of element" ) ;
>

// virtual call in constructor!
cast ( ) ;
>


int main ( )
<
std :: vector < Skill * >skills ;

try
<
skills. push_back ( new Skill ( FIRE ) ) ;
skills. push_back ( new Skill ( SOIL | WATER ) ) ;
// skills.push_back(new Skill(LIGHTNING));
>
catch ( std :: logic_error le )
<
std :: cerr return EXIT_FAILURE ;
>

for ( size_t i = 0 ; i < skills. size ( ) ; i ++ )
<
skills [ i ] - > show ( ) ;
delete skills [ i ] ;
>

В принципе это не так интересно, но вывод будет следующим:

Katon!
Mokuton!
FireSkill::show()
FireSkill:erase()
~FireSkill()
WoodSkill::show()
WoodSkill::erase()
~WoodSkill()

Давайте лучше разберёмся, что же происходит.

Итак, у нас есть класс Skill (конверт), содержащий указатель на объект такого же типа (письмо). Конструктор копирования и оператор присваивания скроем в private от греха подальше. Основной интерес представляют два конструктора класса, один из которых открытый, а другой защищенный, а также деструктор.

Открытый конструктор, он же конструктор Конверта, он же в нашем случае «виртуальный конструктор» (его определение находится ниже), принимает один параметр — тип «элемента», на основе которого будет вычислен тип конструируемого объекта. В зависимости от входного параметра указатель на письмо инициализируется указателем на конкретный объект (FireSkill, WoodSkill и т.п., которые унаследованы от Skill). В случае, если во входном параметре неверное значение, выбрасывается исключение.

В производных классах техник FireSkill, WoodSkill и т.д. конструкторы по умолчанию закрыты, но базовый класс Skill объявлен как friend, что позволяет создавать объекты этих классов только внутри класса Skill. Конструктор копии и оператор присваивания в этих классах закрыты и не определены. Все виртуальные методы класса Skill переопределены в производных.

Виртуальный конструктор должен быть определен ниже всех производных классов, чтобы не пришлось париться с опережающими объявлениями (forward declarations), так как внутри него создаются объекты производных классов.

Когда в виртуальном конструкторе создаются объекты производных классов, при конструировании этих объектов сначала должен вызываться конструктор по умолчанию базового класса. Дефолтный конструктор базового класса ничего не делает, кроме инициализации нулем указателя на письмо. Фактически этот конструктор — конструктор письма, что мы и указываем, записывая в mLetter нуль.

Каким образом происходит вызов виртуальных методов? В базовом классе внутри виртуальных методов идет «перенаправление»: фактически Конверт играет роль оболочки, которая просто вызывает методы Письма. Так как методы Письма вызываются через указатель, то происходит позднее связывание, то есть вызов будет виртуальным. Более того! Мы можем виртуально вызывать методы в конструкторе и деструкторе: при создании объекта Skill (Конверта) происходит вызов параметризованного конструктора этого класса, который конструирует Письмо и инициализирует mLetter. После этого мы вызываем cast(), внутри которого стоит вызов mLetter->cast(). Так как mLetter на этот момент уже инициализирован, происходит виртуальный вызов.

То же самое в деструкторе ~Skill(). Сначала мы проверяем, проинициализирован ли mLetter. Если да, значит мы находимся в деструкторе Конверта, поэтому виртуально вызываем метод зачистки Конверта, а затем его удаляем. Если же нет, значит, мы в деструкторе Конверта, в котором выполняется delete 0 (а эта конструкция вполне безопасна).

Все мы знаем, что в C++ нет такого понятия как виртуальный конструктор, который бы собирал нужный нам объект в зависимости от каких-либо входных параметров на этапе выполнения. Обычно для этих целей используется параметризованный фабричный метод (Factory Method). Однако мы можем сделать «ход конем» и сымитировать поведение виртуального конструктора с помощью методики, называемой «конверт и письмо» («Letter/Envelope»).

Не помню, где я об этом узнал, но, если я не ошибаюсь, такую технику предложил Джим Коплиен (aka James O. Coplien) в книге «Advanced C++ Programming Styles and Idioms».

Идея состоит в том, чтобы внутри базового класса (Конверта) хранить указатель на объект этого же типа (Письма). При этом Конверт должен «перенаправлять» вызовы виртуальных методов на Письмо. С хорошими примерами у меня, как всегда, небольшие проблемки, поэтому «промоделируем» систему магических техник (или заклинаний) =) Предположим, что для каждой техники используется один из пяти основных элементов (а может и их комбинация), от которых зависит воздействие этой техники на окружающий мир и на предмет, к которому она применяется. В то же время мы хотим иметь возможность работать со всеми техниками независимо от их типа.

Для этого создадим базовый класс Skill и производные от него для каждого из типов техник. В базовом классе, чисто для примера, определим три виртуальных метода для создания, отображения техники, а также для зачистки памяти после него.

using std :: cout ;
using std :: endl ;

enum
<
FIRE = 0x01 ,
WIND = 0x02 ,
LIGHTNING = 0x04 ,
SOIL = 0x08 ,
WATER = 0x10
> ;

class Skill // aka Jutsu =)
<
public :
// virtual (envelope) constructor (see below)
Skill ( int _type ) throw ( std :: logic_error ) ;

// destructor
virtual ~Skill ( )
<
if ( mLetter )
<
// virtual call in destructor!
erase ( ) ;
>

delete mLetter ; // delete Letter for Envelope
// delete 0 for Letter
>

virtual void cast ( ) const < mLetter - >cast ( ) ; >
virtual void show ( ) const < mLetter - >show ( ) ; >
virtual void erase ( ) < mLetter - >erase ( ) ; >

protected :
// letter constructor
Skill ( ) : mLetter ( NULL )

private :
Skill ( const Skill & ) ;
Skill & operator = ( Skill & ) ;

Skill * mLetter ; // pointer to letter
> ;


class FireSkill : public Skill
<
public :
~FireSkill ( ) < cout
virtual void cast ( ) const < cout
virtual void show ( ) const < cout
virtual void erase ( ) < cout
private :
friend class Skill ;
FireSkill ( ) < >
FireSkill ( const FireSkill & ) ;
FireSkill & operator = ( FireSkill & ) ;
> ;


class WoodSkill : public Skill
<
public :
~WoodSkill ( ) < cout
virtual void cast ( ) const < cout
virtual void show ( ) const < cout
virtual void erase ( ) < cout
private :
friend class Skill ;
WoodSkill ( ) < >
WoodSkill ( const WoodSkill & ) ;
WoodSkill & operator = ( WoodSkill & ) ;
> ;


Skill :: Skill ( int _type ) throw ( std :: logic_error )
<
switch ( _type )
<
case FIRE :
mLetter = new FireSkill ;
break ;

case SOIL | WATER :
mLetter = new WoodSkill ;
break ;

default :
throw std :: logic_error ( "Incorrect type of element" ) ;
>

// virtual call in constructor!
cast ( ) ;
>


int main ( )
<
std :: vector < Skill * >skills ;

try
<
skills. push_back ( new Skill ( FIRE ) ) ;
skills. push_back ( new Skill ( SOIL | WATER ) ) ;
// skills.push_back(new Skill(LIGHTNING));
>
catch ( std :: logic_error le )
<
std :: cerr return EXIT_FAILURE ;
>

for ( size_t i = 0 ; i < skills. size ( ) ; i ++ )
<
skills [ i ] - > show ( ) ;
delete skills [ i ] ;
>

В принципе это не так интересно, но вывод будет следующим:

Katon!
Mokuton!
FireSkill::show()
FireSkill:erase()
~FireSkill()
WoodSkill::show()
WoodSkill::erase()
~WoodSkill()

Давайте лучше разберёмся, что же происходит.

Итак, у нас есть класс Skill (конверт), содержащий указатель на объект такого же типа (письмо). Конструктор копирования и оператор присваивания скроем в private от греха подальше. Основной интерес представляют два конструктора класса, один из которых открытый, а другой защищенный, а также деструктор.

Открытый конструктор, он же конструктор Конверта, он же в нашем случае «виртуальный конструктор» (его определение находится ниже), принимает один параметр — тип «элемента», на основе которого будет вычислен тип конструируемого объекта. В зависимости от входного параметра указатель на письмо инициализируется указателем на конкретный объект (FireSkill, WoodSkill и т.п., которые унаследованы от Skill). В случае, если во входном параметре неверное значение, выбрасывается исключение.

В производных классах техник FireSkill, WoodSkill и т.д. конструкторы по умолчанию закрыты, но базовый класс Skill объявлен как friend, что позволяет создавать объекты этих классов только внутри класса Skill. Конструктор копии и оператор присваивания в этих классах закрыты и не определены. Все виртуальные методы класса Skill переопределены в производных.

Виртуальный конструктор должен быть определен ниже всех производных классов, чтобы не пришлось париться с опережающими объявлениями (forward declarations), так как внутри него создаются объекты производных классов.

Когда в виртуальном конструкторе создаются объекты производных классов, при конструировании этих объектов сначала должен вызываться конструктор по умолчанию базового класса. Дефолтный конструктор базового класса ничего не делает, кроме инициализации нулем указателя на письмо. Фактически этот конструктор — конструктор письма, что мы и указываем, записывая в mLetter нуль.

Каким образом происходит вызов виртуальных методов? В базовом классе внутри виртуальных методов идет «перенаправление»: фактически Конверт играет роль оболочки, которая просто вызывает методы Письма. Так как методы Письма вызываются через указатель, то происходит позднее связывание, то есть вызов будет виртуальным. Более того! Мы можем виртуально вызывать методы в конструкторе и деструкторе: при создании объекта Skill (Конверта) происходит вызов параметризованного конструктора этого класса, который конструирует Письмо и инициализирует mLetter. После этого мы вызываем cast(), внутри которого стоит вызов mLetter->cast(). Так как mLetter на этот момент уже инициализирован, происходит виртуальный вызов.

То же самое в деструкторе ~Skill(). Сначала мы проверяем, проинициализирован ли mLetter. Если да, значит мы находимся в деструкторе Конверта, поэтому виртуально вызываем метод зачистки Конверта, а затем его удаляем. Если же нет, значит, мы в деструкторе Конверта, в котором выполняется delete 0 (а эта конструкция вполне безопасна).

Как известно, в языке программирования C++ нет прямой поддержки виртуального конструктора, однако, существует идиома, с помощью которой можно имитировать его работу. Прежде чем ее рассматривать, попробуем понять, каким поведением должен обладать виртуальный конструктор.

Для начала вспомним, что дает использование виртуальных функций. Механизм полиморфизма на базе виртуальных функций и наследования позволяет автоматически направлять вызовы производным классам, ничего о них не зная. Если у пользователя есть указатель на базовый класс, значением которого является адрес объекта производного класса, то для вызова некоторого метода производного класса пользователю достаточно знать об интерфейсе базового класса.

Однако, подобное поведение "ломается" непосредственно при создании объектов производных классов, а именно, при присваивании значению указателя на базовый класс адреса объекта производного класса обязательно нужно указывать этот производный класс. Наличие виртуального конструктора позволило бы клиентам с помощью конструктора базового класса создавать объекты производных классов, ничего не зная об их конкретных типах.

Фабричные методы, например, на базе обобщенного конструктора (паттерны Factory Method и Prototype), также предназначены для создания объектов без указания их конкретных типов, однако их поведение отлично от поведения виртуального конструктора.

Идиома, описанная Джеймсом Коплиеном, позволяет имитировать работу виртуального конструктора. Для этого она использует парадигму конверта, в котором лежит письмо. Класс конверта представляет собой базовый класс, содержащий указатель на объект того же базового типа. На практике этот указатель будет указывать на письмо, то есть объект некоторого производного класса. Когда клиент хочет создать объект некоторого типа, то он должен передать идентификатор этого типа в конструктор класса конверта. На основании этого идентификатора конструктор создает в куче объект соответствующего производного класса, адрес которого становится значением указателя на письмо. В дальнейшем все запросы от пользователя перенаправляются конвертом в письмо.

Рассмотрим реализацию идиомы виртуального конструктора на примере порождения воинов для стратегической игры "Пунические войны", описание которой можно найти в разделе Порождающие паттерны. Для простоты будем создавать военные персонажи для некоторой абстрактной армии без учета особенностей воюющих сторон.

Обращаем Ваше внимание, что в соответствии с Федеральным законом N 273-ФЗ «Об образовании в Российской Федерации» в организациях, осуществляющих образовательную деятельность, организовывается обучение и воспитание обучающихся с ОВЗ как совместно с другими обучающимися, так и в отдельных классах или группах.

Обращаем Ваше внимание, что c 1 сентября 2022 года вступают в силу новые федеральные государственные стандарты (ФГОС) начального общего образования (НОО) №286 и основного общего образования (ООО) №287. Теперь требования к преподаванию каждого предмета сформулированы предельно четко: прописано, каких конкретных результатов должны достичь ученики. Упор делается на практические навыки и их применение в жизни.

Мы подготовили 2 курса по обновлённым ФГОС, которые помогут Вам разобраться во всех тонкостях и успешно применять их в работе. Только до 30 июня Вы можете пройти дистанционное обучение со скидкой 40% и получить удостоверение.

Столичный центр образовательных технологий г. Москва

Получите квалификацию учитель математики за 2 месяца

от 3 170 руб. 1900 руб.

Количество часов 300 ч. / 600 ч.

Успеть записаться со скидкой

Форма обучения дистанционная

Виртуальные конструкторы

После знакомства с виртуальными деструкторами возникает вопрос: «Может ли конструктор быть виртуальным?» Ответ – нет, но желаемый эффект можно получить достаточно просто.

Для того чтобы создать объект, конструктор должен знать его точный тип. Следовательно, конструктор не может быть виртуальным. Более того, конструктор является не совсем обычной функцией. В частности, он взаимодействует с процедурами управления памятью способом, недоступным обычным функциям-членам класса. Как следствие, невозможно получить указатель на конструктор.

Оба ограничения можно обойти, определив функцию, которая вызывает конструктор и возвращает созданный объект.

Base( const Base& b);

virtual Base* Create()

virtual Base* Clone()

// Создание нового объекта

Так как функции вроде Create() и Clone() являются виртуальными и создают (косвенно) объекты, их часто называют «виртуальными конструкторами». Однако на самом деле они не являются конструкторами в обычном понимании, просто каждая из них использует конструктор для создания подходящего объекта.

Для создания объекта собственного типа производный класс может заместить функции Create() и/или Clone().

class Derived : public Base

Derived( const Derived& d);

Теперь имея объект класса Base или производного от него класса, можно создать новый объект такого же типа.

// Указатель, присвоенный p1, имеет корректный, но неизвестный тип

Значения, возвращаемые функциями Derived::Create() и Derived::Clone(), имеют тип Derived*, а не Base*. Это позволяет при необходимости создавать новые объекты без потери информации о типе.

void f2(Derived *p)

Тип подменяющей функции должен быть таким же, как тип виртуальной функции, которую она подменяет, за исключением того, что допускаются послабления по отношению к типу возвращаемого значения. Если исходный тип возвращаемого значения был B*, то тип возвращаемого значения подменяющей функции может быть D* при условии, что B является открытым базовым классом для D. Аналогично, вместо B& тип возвращаемого значения может быть ослаблен до D&.


Курс повышения квалификации

Введение в программирование на языке С (СИ)

Курс повышения квалификации

Базовые навыки профессионального использования Word


Курс повышения квалификации

Анализ урока как инструмент развития профессиональных компетенций учителя в соответствии с требованиями ФГОС


«Домашнее обучение. Лайфхаки для родителей»

Краткое описание документа:

Язык C++ – это язык программирования общего назначения, цель которого – сделать работу серьёзных программистов более приятным занятием. За исключением несущественных деталей, язык C++является надмножеством языка С. Помимо возможностей, предоставляемых языком С, язык C++ обеспечивает гибкие и эффективные средства определения новых типов.

Язык программирования служит двум взаимосвязанным целям: он предоставляет программисту инструмент для описания подлежащих выполнению действий и набор концепций, которыми оперирует программист, обдумывая, что можно сделать. Первая цель в идеале требует языка, близкого к компьютеру, чтобы все важные элементы компьютера управлялись просто и эффективно способом, достаточно очевидным для программиста. Язык С создавался на основе именно от этой идеи. Вторая цель в идеале требует языка, близкого к решаемой задаче, чтобы концепции решения могли быть выражены понятно и непосредственно. Эта идея привела к пополнению языка С свойствами, превратившими его в язык C++.

Читайте также: