Игры и Люди

… одетый только в халат из холщовой ткани, ходил в кабачки и к певичкам. Когда его спрашивали, почему он таков, он каждый раз открывал рот, засовывал туда кулак и не говорил. Император Лян-цзун призвал его и спросил: «Каков принцип Вашего Пути?» Гуйчжэнь ответил: «Одежда тонка — поэтому люблю вино, выпью вина и защищусь от холода, напишу картину — и расплачусь за вино. Кроме этого, ничего не умею». Лян-цзун не нашелся, что сказать…

От игрушек детства мы движемся к другим. Здесь — об этом.

Алхимия игры включает несколько ингредиентов.

Рецептура состоит из Миров, по которым можно путешествовать; не все из них достаточно хорошо населены. Дело — это Игрушка одного из миров.

Объединяя видимые и сокрытые элементы, Алхимия выступает и как самостоятельный Игрок.

Шахерезада и Эриксон. Тройная спираль

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

Среди моих знакомых была одна барышня. Она работала в большой и авторитетной организации, которая и направила ее в штаты изучать технику гипноза Эриксона. Коротко — это техника введения собеседника в транс в ходе обычной беседы. После обучения она успешно применяла эту технику, выполняя задания своей организации. Работала с бизнесменами и политиками. Насколько я могу судить по ее рассказам, довольно успешно.

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

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

Эриксон

Милтон Эриксон заболел полиомиелитом, когда ему было 17 лет. Из-за болезни он оказался парализован; врачи прогнозировали, что он останется неподвижным навсегда. Несмотря на прогноз, он заново учился двигаться и ходить с помощью самонаблюдения и работы с памятью тела. Всю жизнь он боролся с последствиями болезни; несмотря на свой недуг он создал уникальный метод недирективного гипноза и стал основателем современной гипнотерапии.

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

  • история №1 (начало): гипнотерапевт начинает первую историю, завязывается сюжет но вместо того чтобы продолжаться история останавливается, и начинается история №2.
  • история №2 (вложена в первую): начинается вторая история, вовлекая слушателя в новый сюжет, и она снова прерывается.
  • история №3 (внушение): начинается третья история, в которую вплетается главное терапевтическое внушение (послание для подсознания).

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

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

Забавно, что это напомнило мне хакерскую атаку с помощью TCP пакетов SYN, за которыми не происходило создание соединения. Операционная система держала полуоткрытые соединения которые никогда не закрывались, после чего происходил отказ в обслуживании. Конечно, это давно поправили.

Много позже, когда я размышлял о том, что придумал Эриксон, мне все время казалось что я все это где-то видел или слышал. И в конце концов вспомнил.

Шахерезада

Вот оно, сказка «Тысяча и одна ночь». Эриксоновская техника во всей своей красе. Точнее наоборот: у Эриксона во всей красе техника Шахерезады. Итак, вспоминаем начало сказки…

Царь Шахрияр обезумел после измены своей жены. Он убил ее и после этого, чтобы исключить будущие измены, приказал казнить каждую новую жену на рассвете. Шахерезада, чтобы прекратить убийства невинных девушек сама вызвалась стать его новой женой. Она шла на верную смерть — палач как обычно был готов и ждал утреннего сигнала к казни. И в первую ночь она начинает свой рассказ…

Богатый купец остановился отдохнуть под деревом. Он ел финики и выбрасывал косточки. В этот момент из-под земли внезапно вырос грозный дух (ифрит) с обнаженным мечом. Он заявил, что одна из брошенных косточек попала в глаз его невидимому сыну и убила его, поэтому теперь купец должен умереть.

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

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

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

Хасиб Карим и Царица змей

Как пример — один из самых глубоких, многослойных сюжетов Шахерезады, где «петли» закручиваются на несколько уровней вниз, полностью дезориентируя привычную логику читателя.

Петля 1: Дровосек Хасиб попадает в подземное царство и знакомится с Царицей змей. Чтобы он не скучал и не пытался сбежать, Царица начинает рассказывать ему истории.

Петля 2: Она рассказывает масштабную «Повесть о Булукии» (о сыне царя, который отправился на поиски тайных знаний и кольца Соломона). В ходе своих странствий Булукия встречает персонажа по имени Джаншах.

Петля 3 (Ядро): Разворачивается «История Джаншаха» — огромная сказка внутри сказки о любви к птице-деве, замках, джиннах и тяжелых испытаниях.

Закрытие петель: Завершается история Джаншаха -> Завершается путешествие Булукии -> Хасиб возвращается в свой мир, обогащенный мудростью этих метафор.

Последняя петля

По замыслу, последняя петля должна нести в себе внушение. Как это работало в историях Шахерезады?

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

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

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

Трансформация гнева в милость: В «Рассказе о купце и духе» Джинн (прямая проекция самого Шахрияра) под воздействием историй меняет гнев на милосердие. Внушение: «Даже самое жестокое существо способно простить, если его разум откроется мудрости».

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

Опасный переход

Что может произойти в момент, когда очередная история рассказана, интрига угасла, а следующая история еще не началась? Возникает опасная ситуация — почему бы Шахрияру в этот переходной момент не вспомнить о своих до конца не излеченных дурных наклонностях и не дать приказ о казни рассказчицы? Тут вступали в силу другие техники, и когда видишь все это через призму современного НЛП, удивляешься тому как женщины взяли их на вооружение много лет назад:

1. Метод «А ведь это еще цветочки…» (Обесценивание финала)

Как только история завершалась хэппи-эндом или справедливым возмездием, Шахерезада тут же занижала ценность только что услышанного царем финала.Как это звучало: «…И они жили долго и счастливо, пока не пришла к ним разрушительница наслаждений и разлучительница встреч (смерть). Но это, о царь, ничто по сравнению с тем, что случилось с…». Создан новый дефицит информации.

2. Провокация эго и авторитета царя.

Шахерезада часто завершала внутреннюю петлю притчей о мудром правителе или справедливом судье, а затем напрямую обращалась к Шахрияру, связывая финал истории с его личностью.Как это звучало: «…И так тот великий султан пощадил своего врага, проявив высшую мудрость, которой славятся лишь истинно великие цари, подобные тебе, о владыка. И если бы ты позволил мне, я бы рассказала тебе историю о другом царе, который столкнулся с еще более сложным выбором…». У царя возникало желание продолжить, чтобы подтвердить свой статус великого и справедливого.

3. Использование Дуньязады (Техника «Подсадной утки»).

Это главный секрет «Тысячи и одной ночи». На протяжении всех ночей у ложа царя на ковре сидела младшая сестра Шахерезады — Дуньязада. Она выполняла роль «разогревающей» аудитории и была голосом подсознания самого царя (здесь я не могу не удержаться чтобы не поставить восклицательные знаки — о нравы двора, когда сестра жены присутствует при игрищах на супружеском ложе!). Как это работало: Как только Шахерезада закрывала петлю и умолкала, наступала опасная пауза. В эту же секунду Дуньязада восклицала: «О сестрица, как прекрасен, удивителен и утончен твой рассказ!» На что Шахерезада смиренно отвечала: «Этот рассказ — ничто по сравнению с тем, что я расскажу вам в следующую ночь, если о о царь пощадит меня и я останусь жива».

Эти психотерапевтические технологии мы можем встретить в самых неожиданных местах. Например, ими грешат известные бизнес — тренеры. Вот петли Энтони Робинса:

Энтони Робинс

Удержание внимания (Захват сознания). Тони начинает яркую историю из своей молодости (Петля 1). В самый эмоциональный момент он резко обрывает её фразой в духе: «И в тот момент я понял то же самое, что понял мой друг, миллиардер, когда…» — и уходит во вторую историю (Петля 2). Зал заворожен, мозг требует развязки первой истории и находится в режиме повышенного ожидания.

Петля 2: история про миллиардера, которая точно также неожиданно обрывается.

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

Закрытие петель и катарсис: Робинс последовательно досказывает финал третьей истории, возвращается к миллиардеру, а в самом конце выдает мощную, вдохновляющую развязку первой истории. Зрители испытывают эмоциональный пик (эйфорию), связывая это приятное чувство с тем бизнес-уроком, который был заложен в центре.

Мне приходилось посещать бизнес — тренинги коуча, который учился у Энтони Робинса. Этих секретов он не раскрывал, но говорил о том что такое «рваное» повествование имеет преимущество перед линейным.

Милая женская болтовня

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

P.S. Не знаю как у вас, а у меня после того как я прочитал как третий старец вел пегого мула, появилось мучительное желание узнать, почему он пегий 🙂

 

Аналоговый стабилизатор тока

Analog source of current, front panel

Передняя панель управляемого стабилизатора тока

Analog source of current, inside

Внутренности стабилизатора/источника тока. К задней крышке крепятся, сверху вниз: аналоговая плата, микроконтроллер, бустер. На фронтовой панели органы управления и индикации

В моем заказном столе, сразу под столешницей, есть выдвижной ящик. Это промежуточный кэш, куда вначале попадает все что находится на столе, и потом перекочевывает на свои места в другие, менее приоритетные ящики. В последнее время я все время натыкался на свое изделие, а раз так, решил написать про него. Мне нравится, как я сделал аналоговый источник/стабилизатор тока, плюс предмет моей гордости — лаконичный интерфейс состоящий из дисплея на семисегментных индикаторах, крутилка — джойстик на потенциометре и всего две кнопки — Set, Start и Stop.

Аналоговыми вещами я занимался давно, и представился случай тряхнуть стариной — сделать  прототип  чего-либо  подобного.

Даже и не знаю, как его назвать — это разработанный и изготовленный по заказу косметолога приборчик, задача которого — держать выходной ток через внешние электроды стабильным и менять его по определенной программе. Даже и думать не хочу, что планируют делать косметологи со своими пациентами (пытают?), знаю только, что есть много факторов которые будут мешать стабилизации — контакт электродов с кожей, ее потливость (когда пытки становятся интенсивнее), ну и может ее электропроводность, которую никто не может посчитать заранее. Поэтому стабильный ток на выходе — нужен.

Сразу оговорюсь, что я использую термин «ток» не в общеупотребительном смысле, а именно как физическую величину I, в отличие от напряжения U. Напоминаю, что в электротехнике «источник тока» это специальный термин, точно также как и «источник напряжения».

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

The device electric diagram

Электрическая принципиальная схема стабилизатора/источника тока

На схеме незримо присутствует микроконтроллер (МК) STM32F103, выдавая себя своими контактами. Само собой, на нем крутится программа, на работу которой мы будем иногда отвлекаться.

Начнем с электропитания. Аккумулятор форм-фактора Кроны BT1 подключается через защитный диод Шоттки D1. Не забываем, что косметологи это люди которым ничего не стоит переполюсовать батарею и засадить её против ее контактных площадок. Мы знаем своих клиентов!

Дальше пути 9 вольт расходятся (на самом деле 8.4 В, аккумулятор же, но пусть будет так). Одна линия идет на стабилизатор U1, который питает пищалку (есть и такое) на транзисторе Q1 и ЦАП на транзисторе Q4. Да — да, вы не ослышались, это цифро-аналоговый преобразователь. В нашем простейшем МК его нет, поэтому — сделай сам. К ЦАП мы сейчас вернемся, а пока завершим с электропитанием.

Другая линия 9 В идет на ключ, образованный Q2 и Q3, задача которого — по команде с МК подавать питание на бустер U2, который повышает напряжение до 30 В. Как вы помните, напряжение до 36 В считается относительно безопасным для человеческого организма. Это напряжение используется для формирования стабильного тока.

Вернемся к ЦАП. Его задача — сформировать управляющее напряжение на входе источника тока. ЦАП состоит из операционника U3A (вход 3) и транзистора Q5. Это напряжение будет полностью определять ток во внешней цепи электродов J5. Как работает этот ЦАП? На вход транзистора Q4 подается PWM сигнал от МК. Управление осуществляется изменением скважности PWM, что делает софт — устанавливая ее для заданных временных интервалов или вручную через крутилку. Q4 нагружен на RC цепочку — фильтр нижних частот R5, R6, C1. Постоянная времени фильтра выбрана большой; благодаря этому на выходе фильтра формируется постоянное напряжение, пропорциональное скважности импульсов PWM.

Транзистор Q4 работает в ключевом режиме. Для того чтобы время заряда и разряда конденсатора C1 было одинаковым, используется диод D2: заряд при запертом Q4 идет по цепи 5 В -> R5 -> D2, разряд при открытом Q4 идет по цепи R6 -> Q4. Сопротивления резисторов R5 и R6 равны. Таким образом, цифро-аналоговое преобразование выполняется через управление скважностью цифрового сигнала, с пропорциональным изменением постоянной составляющей которую выделяет RC фильтр.

В схеме есть измеритель выходного тока электродов для его отображения на индикаторе и коррекции. Он реализован на операционнике U3B, выход которого идет на АЦП МК PA1. Выходной ток проходит через токовый шунт номиналом 100 Ом и измерение напряжения (и значит тока) производится на нем.

Потенциометр / крутилка / джойстик подключен к другому АЦП МК PA0, кнопки — к GPIO. Пищалка получает звук от МК и сигнализирует об окончании процедуры. Дисплей подключается по последовательному интерфейсу и работает от МК.

И теперь переходим к главному — собственно к источнику тока. Он реализован на p-n-p транзисторе Q5. Тип p-n-p потому что комфортней иметь общий провод ближе к земле, а не к питанию.

Идея схемы на Q5 — эмиттерный повторитель. Это значит, что благодаря обратной связи по напряжению повторитель держит стабильное напряжение на резисторе в эмиттерной цепи, практически не чувствуя нагрузки (естественно, в определенных пределах). Стабильное напряжение на резисторе — это значит стабильный ток в эмиттерной цепи и соответственно в коллекторной, поскольку это один и тот же ток. Вот так и выглядит дизайн источника/стабилизатора тока.

В статье про однокаскадный усилитель я подробно разбирал принцип действия эмиттерного повторителя. Напомню еще раз — сигнал обратной связи как сигнал рассогласования получается как разность напряжения на базе и падения напряжения на резисторе в эмиттерной цепи. Но в этой схеме я пошел еще дальше. Я дополнил схему операционником, благодаря чему сигнал рассогласования усиливается многократно, что ведет к более стабильной работе схемы. U3a с одной стороны на неинвертирующем входе получает управляющее напряжение, которого он должен держаться, на инвертирующем — сигнал обратной связи с эмиттерного резистора R14. За счет большого усиления в этой цепи, гораздо большего чем может себе позволить одиночный транзистор, номинал резистора R14 можно держать низким, что благоприятно сказывается на диапаоне выходных токов схемы. Будут вопросы по схеме — пишите!

В такого типа устройствах, когда провода выходят наружу, первым делом возникает мысль — а что если их закоротить и тем самым сжечь прибор? Это как раз не наш случай. Режим короткого замыкания для источника тока — самый комфортный и естественный режим. Теоретически, для него разомкнутая цепь также катастрофична как и короткозамкнутая для источника напряжения.

То, про что еще можно рассказать — это софт. Тут вы сами можете дать волю своему творчеству. Со своей стороны замечу, что несмотря на простоту, дисплей имеет хорошую функциональность — на нем можно отображать и выбирать пункты меню, пользуясь крутилкой/потенциометром для скроллинга, задавать этой же крутилкой таймеры и выходной ток, задавать сложные программы когда выходной ток должен меняться со временем.

Пока прототип ушел к своему заказчику, и не исключено что мы его запустим в серию. Но это уже про маркетинг )

Виртуальные функции C++. Следствие ведут Колобки

Двигаемся поэтапно, с самого начала.

1. Никаких виртуальных функций (пока что)

Используем struct вместо class чтобы каждый раз не писать public. В нашем примере не будет никаких приватных членов класса, а в остальном все тоже самое:

Функция f()  переопределена в дочернем классе Child (overriding, не путать с overloading). Вызов функций:

Пока никаких неожиданностей нет — все работает как должно.

Замечу, что если в дочернем классе не будет функции (2), то будет вызвана функция (1) родительского класса. Это происходит потому, что Child хранит гены родителя Parent и в силу наследования имеет доступ ко всем полям родительского класса. Но это так, к слову.

2. Все еще никаких виртуальных функций

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

Указатель на Parent, а объект Child… нет ли здесь несоответствия или противоречия?

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

При этом родительский класс не знает абсолютно ничего про остальные поля и функции, которые эксклюзивно находятся в Child. И если последний содержит например функцию g(), то компиляция p->g() даст ошибку.

В ситуации наоборот

Указатель захочет сослаться на поля, которые есть только в Child, но в объекте Parent их быть не может!

3. Подозрительная конструкция

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

когда все прекрасно работает и без нее? Следствие, которое ведут Колобки, знает: встретили такую запись — значит где-то поблизости виртуальная функция (и может быть не одна).

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

Поэтому смотрим пока на то что «нет смысла», а потом переходим к заключительному полноценному примеру.

4. Бессмысленная виртуальная функция

Теперь функция f() стала виртуальной. Заведите хорошую привычку дописывать override в дочерних классах, чтобы во-первых было понятно что функция виртуальная (это здесь все видно, а если вы копаетесь в многочисленных листингах?), и во-вторых это страхует вас от ошибки в сигнатуре функции — без override компилятор все пропустит, но будет считать f() в дочернем классе уже не виртуальной, а с override — предупредит.

Повторяем наш эксперимент с самого начала.

Вы заметили какую — нибудь разницу по сравнению с первым сценарием без виртуальных функций? И я тоже нет.

Давайте быстро забудем про это бессмысленное применение virtual и перейдем к нашей сакраментальной конструкции, и тут она уже заиграет в полную силу.

5. Складываем все вместе

Объявление класса с виртуальными функциями:

Действие:

У меня для вас новость: объект родительского класса каким-то образом узнал про функцию в дочернем классе и вызвал именно ее. Как он это сделал?

Сейчас самое главное — не погрузиться в дебри новых понятий и не потерять прозрачность повествования. Новое понятие — это таблица виртуальных функций vtable класса Parent, которая содержит указатели на виртуальные функции. Отныне все вызовы виртуальных функций будут происходить не через указатель класса Parent* p, а через посредника — таблицу vtable.

Принципиально важным является то, что содержимое этой таблицы не задается жестко во время компиляции, а может меняться по ходу выполнения программы (это то, что вас на собеседовании спрашивали про позднее связывание или dynamic binding). Если мы поймем, как и когда эта таблица заполняется и меняется, мы поймем все про виртуальные функции. Поехали!

6. Gdb, vtbl

Ехать будем с помощью отладчика gdb — это наиболее удобный способ посмотреть расположение vtable и виртуальных функций в памяти. Поменяем наш пример, чтобы с отладчиком было удобнее работать:

Компилируемся, запускаем отладку:

Замечу что b = d еще не выполнялось: мы остановились до этой строчки.

Для успокоения души проверим адреса, которые нам выдал отладчик, например для b:

Все в порядке, vtable содержит адреса Base::base_and_derived() и Base::base() (доверяй, но проверяй!)

Теперь посмотрим на таблицы, на какие виртуальные функции они указывают. С классом Base все понятно, это пара собственных виртуальных функций base_and_derived(), base(). С дочерним классом Derived немного интереснее: его таблица содержит переопределенную виртуальную функцию базового класса base_and_derived(), собственно виртуальную функцию base() которая принадлежит базовому классу (родитель!) и собственная виртуальная derived().

Само собой, адреса виртуальных таблиц 0x555555557d50 и 0x555555557d28 различаются, поскольку у каждого класса (не экземпляра класса!) своя виртуальная таблица. Это замечание пригодится нам прямо сейчас.

Продолжаем программу и выполняем наше легендарное присвоение указателя производного класса указателю базового класса:

 

Произошли существенные изменения, и главное из них — мы фактически потеряли виртуальную таблицу базового класса (что еще можно было ожидать от присваивания?) Точнее, базовый и производный класс сейчас содержат только одну виртуальную таблицу расположенную по адресу 0x555555557d28, которая по сути таблица класса Derived оставленная без изменений —.

Поскольку класс Base теперь пользуется виртуальной таблицей класса Derived, предыдущая запись
0x5555555552a0 <Base::base_and_derived()>

Поменялась на запись
0x5555555552a0 <Base::base_and_derived()>

какой она и была для Derived раньше.

Это означает: все вызовы виртуальной функции base_and_derived выполненные с помощью указателя b->base_and_derived() приведут не к вызову виртуальной функции базового класса (как можно было ожидать, ведь b — указатель на Base), а к вызову виртуальной функции произвольного класса.

Что и требовалось доказать.

7. Послесловие

Вот и все. Приведу пример, когда это бывает нужно в реальной жизни. Например, клиент знает только про класс Interface и пользуется им:

У нас есть возможность подсовывать различные варианты реализации интерфейса, оставляя клиента в неведении:

Этот пример можно воспринимать по другому: например, Implementation_1 это боевая реализация, а Implementation_2 это mock заглушка для тестирования. Или Interface это класс прокси или адаптера. В общем все шаблоны C++ которые только существуют базируются на этой записи:

и это все, что вам нужно знать про полиморфизм в C++.

Микрофонный усилитель на LM358

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

На самом деле микрофонный усилитель — это не просто так, а

Читать дальше

PyTorch: fast array computations on GPU

When using numpy at the beginning of a project we don’t think about performance. This is because it is more important for us to get solution that works. And only then, with real data, observing how our computer begins to slow down, we have to find answer on how to avoid this. And then we

Читать дальше

Дружище C.Elegans и его нейрокомпьютер

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

Читать дальше

Автоматическое обнаружение радиолокационных станций визуальной подсистемой БЛА

По сравнению с такими шустрыми средствами, как противорадиолокационные ракеты (Anti Radar Missile) беспилотник выглядит сущим недоразумением. Однако, это всего лишь следствие инерции мышления, когда на самом деле главный недостаток БЛА по сравнению с ракетой — низкая скорость, становится преимуществом в следующих случаях:

нужно хорошенько рассмотреть цель; можно позволить себе прогуляться для того чтобы выбрать что-либо

Читать дальше

Техника образов. Сейчас и раньше

Множество психотехник проникает в нашу жизнь. Одна из них — визуализация желательных событий. Утверждается, что представляя объект своих устремлений в виде образа — мысленно, или в звуках или хотя бы на бумаге — вы рано или поздно его получите. Наконец найден волшебный эликсир для диванной армии вершителей реальности: не затрачивая времени и сил, сберегая нервы

Читать дальше

Обработка потока с видеокамеры средствами ПЛИС/FPGA. OV7670 + Zedboard

В статье маркеры визуальной системы автоматической посадки БЛА была описана обработка видео-данных реального времени для системы оптического типа — VBLS. Это была хоть и шустрая, сделанная на C++, но модель. Теперь, как было замечено в конце этой статьи, пришло время показать систему в боевом варианте, где обработка видеопотока параллелится в ПЛИС.

В данной системе для

Читать дальше

Маркеры визуальной системы автоматической посадки БЛА

Визуальная автоматическая посадка БЛА может выполняться не только по характерным точкам местности, но и по специально подготовленным и известным изображениям — маркерам. Собственно сама стандартная разметка ВПП состоит из таких маркеров, только исторически они предназначались не для обработки компьютером, а для человека — пилота. Поэтому нет ничего удивительного в том, что искусственный интеллект дрона потребует

Читать дальше