[{"data":1,"prerenderedAt":19985},["ShallowReactive",2],{"navigation_docs":3,"-cpp-virtual-functions-polymorphism":5246,"-cpp-virtual-functions-polymorphism-surround":19980},[4,1707,2100,2572,2753,2879,3086,3208,3258,3315,3349,3475,3552,3566,3705,3999,4076,4809,4984,5077,5130,5242],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"C#","i-devicon-csharp","\u002Fcsharp","01.csharp",[10,13,60,90,120,202,219,253,379,404,457,650,1364,1654,1703],{"title":11,"path":7,"stem":12},"C# та .NET","01.csharp\u002Findex",{"title":14,"icon":15,"path":16,"stem":17,"children":18,"page":59},"Fundamentals","i-lucide-book-open","\u002Fcsharp\u002Ffundamentals","01.csharp\u002F01.fundamentals",[19,23,27,31,35,39,43,47,51,55],{"title":20,"path":21,"stem":22},"Вступ до екосистеми .NET","\u002Fcsharp\u002Ffundamentals\u002Fintroduction-to-ecosystem","01.csharp\u002F01.fundamentals\u002F01.introduction-to-ecosystem",{"title":24,"path":25,"stem":26},"Структура програми на C#","\u002Fcsharp\u002Ffundamentals\u002Fprogram-structure","01.csharp\u002F01.fundamentals\u002F02.program-structure",{"title":28,"path":29,"stem":30},"Змінні та Типи Даних","\u002Fcsharp\u002Ffundamentals\u002Fvariables-data-types","01.csharp\u002F01.fundamentals\u002F03.variables-data-types",{"title":32,"path":33,"stem":34},"Масиви","\u002Fcsharp\u002Ffundamentals\u002Farrays","01.csharp\u002F01.fundamentals\u002F04.arrays",{"title":36,"path":37,"stem":38},"Strings & Text Handling","\u002Fcsharp\u002Ffundamentals\u002Fstrings-text-handling","01.csharp\u002F01.fundamentals\u002F05.strings-text-handling",{"title":40,"path":41,"stem":42},"Дати і Час","\u002Fcsharp\u002Ffundamentals\u002Fdates-time-handling","01.csharp\u002F01.fundamentals\u002F06.dates-time-handling",{"title":44,"path":45,"stem":46},"Потік Керування","\u002Fcsharp\u002Ffundamentals\u002Fcontrol-flow","01.csharp\u002F01.fundamentals\u002F07.control-flow",{"title":48,"path":49,"stem":50},"Методи","\u002Fcsharp\u002Ffundamentals\u002Fmethods","01.csharp\u002F01.fundamentals\u002F08.methods",{"title":52,"path":53,"stem":54},"Основи Відлагодження","\u002Fcsharp\u002Ffundamentals\u002Fdebugging-basics","01.csharp\u002F01.fundamentals\u002F09.debugging-basics",{"title":56,"path":57,"stem":58},"Інтерактивна Консоль (Classic)","\u002Fcsharp\u002Ffundamentals\u002Finteractive-console","01.csharp\u002F01.fundamentals\u002F10.interactive-console",false,{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":59},"OOP","i-lucide-box","\u002Fcsharp\u002Foop","01.csharp\u002F02.oop",[66,70,74,78,82,86],{"title":67,"path":68,"stem":69},"Package Management (Управління Пакетами)","\u002Fcsharp\u002Foop\u002Fpackage-management","01.csharp\u002F02.oop\u002F01.package-management",{"title":71,"path":72,"stem":73},"Класи та Об'єкти","\u002Fcsharp\u002Foop\u002Fclasses-objects","01.csharp\u002F02.oop\u002F02.classes-objects",{"title":75,"path":76,"stem":77},"Властивості та Поля","\u002Fcsharp\u002Foop\u002Fproperties-fields","01.csharp\u002F02.oop\u002F03.properties-fields",{"title":79,"path":80,"stem":81},"Стовпи ООП","\u002Fcsharp\u002Foop\u002Foop-pillars","01.csharp\u002F02.oop\u002F04.oop-pillars",{"title":83,"path":84,"stem":85},"Advanced Types","\u002Fcsharp\u002Foop\u002Fadvanced-types","01.csharp\u002F02.oop\u002F05.advanced-types",{"title":87,"path":88,"stem":89},"Namespaces (Простори Імен)","\u002Fcsharp\u002Foop\u002Fnamespaces","01.csharp\u002F02.oop\u002F06.namespaces",{"title":91,"icon":92,"path":93,"stem":94,"children":95,"page":59},"Advanced Core","i-lucide-zap","\u002Fcsharp\u002Fadvanced-core","01.csharp\u002F03.advanced-core",[96,100,104,108,112,116],{"title":97,"path":98,"stem":99},"Generics (Узагальнення)","\u002Fcsharp\u002Fadvanced-core\u002Fgenerics","01.csharp\u002F03.advanced-core\u002F01.generics",{"title":101,"path":102,"stem":103},"Делегати, Події та Лямбда-вирази","\u002Fcsharp\u002Fadvanced-core\u002Fdelegates-events-lambdas","01.csharp\u002F03.advanced-core\u002F02.delegates-events-lambdas",{"title":105,"path":106,"stem":107},"Interfaces Deep Dive (Інтерфейси: Поглиблений Розгляд)","\u002Fcsharp\u002Fadvanced-core\u002Finterfaces-deep-dive","01.csharp\u002F03.advanced-core\u002F03.interfaces-deep-dive",{"title":109,"path":110,"stem":111},"Обробка Винятків","\u002Fcsharp\u002Fadvanced-core\u002Fexception-handling","01.csharp\u002F03.advanced-core\u002F04.exception-handling",{"title":113,"path":114,"stem":115},"Pattern Matching","\u002Fcsharp\u002Fadvanced-core\u002Fpattern-matching","01.csharp\u002F03.advanced-core\u002F05.pattern-matching",{"title":117,"path":118,"stem":119},"Додаткові Можливості C#","\u002Fcsharp\u002Fadvanced-core\u002Fadditional-features","01.csharp\u002F03.advanced-core\u002F06.additional-features",{"title":121,"icon":122,"path":123,"stem":124,"children":125,"page":59},"Architecture Best Practices","i-lucide-building-2","\u002Fcsharp\u002Farchitecture-best-practices","01.csharp\u002F04.architecture-best-practices",[126,130,149,153,157,161,165,169],{"title":127,"path":128,"stem":129},"Software Design Principles (Частина 1)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fsoftware-design-principles","01.csharp\u002F04.architecture-best-practices\u002F01.software-design-principles",{"title":131,"icon":132,"path":133,"stem":134,"children":135,"page":59},"Design Patterns","i-lucide-folder","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns",[136],{"title":137,"icon":132,"path":138,"stem":139,"children":140,"page":59},"Creational","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational",[141,145],{"title":142,"path":143,"stem":144},"Singleton (Одинак)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational\u002Fsingleton","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational\u002F01.singleton",{"title":146,"path":147,"stem":148},"Builder (Будівельник)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational\u002Fbuilder","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational\u002F02.builder",{"title":150,"path":151,"stem":152},"Building Professional CLIs","\u002Fcsharp\u002Farchitecture-best-practices\u002Fbuilding-professional-clis","01.csharp\u002F04.architecture-best-practices\u002F03.building-professional-clis",{"title":154,"path":155,"stem":156},"Validation & Flow Control","\u002Fcsharp\u002Farchitecture-best-practices\u002Fvalidation-flow-control","01.csharp\u002F04.architecture-best-practices\u002F04.validation-flow-control",{"title":158,"path":159,"stem":160},"The Modern .NET Host (Microsoft.Extensions)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fmodern-dotnet-host","01.csharp\u002F04.architecture-best-practices\u002F05.modern-dotnet-host",{"title":162,"path":163,"stem":164},"Data Mapper: Repository та DAO патерни (Частина 1)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdata-mapper-part1","01.csharp\u002F04.architecture-best-practices\u002F06.data-mapper-part1",{"title":166,"path":167,"stem":168},"Data Mapper: Repository та DAO патерни (Частина 2)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdata-mapper-part2","01.csharp\u002F04.architecture-best-practices\u002F07.data-mapper-part2",{"title":170,"icon":132,"path":171,"stem":172,"children":173,"page":59},"Di Ioc","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc",[174,178,182,186,190,194,198],{"title":175,"path":176,"stem":177},"Проблема залежностей та Інверсія Контролю","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fthe-dependency-problem","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F01.the-dependency-problem",{"title":179,"path":180,"stem":181},"Будуємо власний Service Container","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fbuild-your-own-container","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F02.build-your-own-container",{"title":183,"path":184,"stem":185},"Service Locator: Паттерн та Анти-паттерн","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fservice-locator-pattern","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F03.service-locator-pattern",{"title":187,"path":188,"stem":189},"Паттерни Dependency Injection","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fdependency-injection-patterns","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F04.dependency-injection-patterns",{"title":191,"path":192,"stem":193},"Microsoft DI: IServiceCollection та IServiceProvider","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fmicrosoft-di-deep-dive","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F05.microsoft-di-deep-dive",{"title":195,"path":196,"stem":197},"Service Lifetimes та Scopes","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fservice-lifetimes-and-scopes","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F06.service-lifetimes-and-scopes",{"title":199,"path":200,"stem":201},"DI Анти-паттерни та Найкращі Практики","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fdi-anti-patterns-and-best-practices","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F07.di-anti-patterns-and-best-practices",{"title":203,"icon":132,"path":204,"stem":205,"children":206,"page":59},"Standard Library","\u002Fcsharp\u002Fstandard-library","01.csharp\u002F05.standard-library",[207,211,215],{"title":208,"path":209,"stem":210},"Collections (Колекції)","\u002Fcsharp\u002Fstandard-library\u002Fcollections","01.csharp\u002F05.standard-library\u002F01.collections",{"title":212,"path":213,"stem":214},"High Performance Types (Високопродуктивні Типи)","\u002Fcsharp\u002Fstandard-library\u002Fhigh-performance-types","01.csharp\u002F05.standard-library\u002F02.high-performance-types",{"title":216,"path":217,"stem":218},"LINQ (Language Integrated Query)","\u002Fcsharp\u002Fstandard-library\u002Flinq","01.csharp\u002F05.standard-library\u002F03.linq",{"title":220,"icon":221,"path":222,"stem":223,"children":224,"page":59},"System Internals Concurrency","i-lucide-server","\u002Fcsharp\u002Fsystem-internals-concurrency","01.csharp\u002F06.system-internals-concurrency",[225,229,233,237,241,245,249],{"title":226,"path":227,"stem":228},"Memory Management","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fmemory-management","01.csharp\u002F06.system-internals-concurrency\u002F01.memory-management",{"title":230,"path":231,"stem":232},"Reflection API: System.Type та Метадані","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Freflection-fundamentals","01.csharp\u002F06.system-internals-concurrency\u002F02.reflection-fundamentals",{"title":234,"path":235,"stem":236},"Attributes та Dynamic Language Runtime","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fattributes-dynamic","01.csharp\u002F06.system-internals-concurrency\u002F03.attributes-dynamic",{"title":238,"path":239,"stem":240},"Expression Trees: Швидка Альтернатива Рефлексії","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fexpression-trees-compiled","01.csharp\u002F06.system-internals-concurrency\u002F04.expression-trees-compiled",{"title":242,"path":243,"stem":244},"Source Generators: Compile-Time Code Generation","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fsource-generators","01.csharp\u002F06.system-internals-concurrency\u002F05.source-generators",{"title":246,"path":247,"stem":248},"Multithreading Fundamentals","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fmultithreading-fundamentals","01.csharp\u002F06.system-internals-concurrency\u002F06.multithreading-fundamentals",{"title":250,"path":251,"stem":252},"Synchronization Primitives","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fsynchronization-primitives","01.csharp\u002F06.system-internals-concurrency\u002F07.synchronization-primitives",{"title":254,"icon":255,"path":256,"stem":257,"children":258,"page":59},"System Programming Windows","i-lucide-cpu","\u002Fcsharp\u002Fsystem-programming-windows","01.csharp\u002F07.system-programming-windows",[259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,347,351,355,359,363,367,371,375],{"title":260,"path":261,"stem":262},"Як Працює Операційна Система","\u002Fcsharp\u002Fsystem-programming-windows\u002Fhow-os-works","01.csharp\u002F07.system-programming-windows\u002F01.how-os-works",{"title":264,"path":265,"stem":266},"Процеси в .NET — API та Запуск","\u002Fcsharp\u002Fsystem-programming-windows\u002Fprocesses-in-dotnet","01.csharp\u002F07.system-programming-windows\u002F02.processes-in-dotnet",{"title":268,"path":269,"stem":270},"Процеси в .NET — IPC та Міжпроцесна Комунікація","\u002Fcsharp\u002Fsystem-programming-windows\u002F02a.processes-ipc","01.csharp\u002F07.system-programming-windows\u002F02a.processes-ipc",{"title":272,"path":273,"stem":274},"Application Domains та Збірки — AppDomain і AssemblyLoadContext","\u002Fcsharp\u002Fsystem-programming-windows\u002Fappdomains-assemblies","01.csharp\u002F07.system-programming-windows\u002F03.appdomains-assemblies",{"title":276,"path":277,"stem":278},"Application Domains та Збірки — Plug-in Система з Hot-Reload","\u002Fcsharp\u002Fsystem-programming-windows\u002F03a.appdomains-plugin-system","01.csharp\u002F07.system-programming-windows\u002F03a.appdomains-plugin-system",{"title":280,"path":281,"stem":282},"Потоки — Основи та API Thread","\u002Fcsharp\u002Fsystem-programming-windows\u002Fthread-fundamentals","01.csharp\u002F07.system-programming-windows\u002F04.thread-fundamentals",{"title":284,"path":285,"stem":286},"Потоки — Lifecycle, Пріоритети та Безпечне Завершення","\u002Fcsharp\u002Fsystem-programming-windows\u002F04a.thread-lifecycle-priorities","01.csharp\u002F07.system-programming-windows\u002F04a.thread-lifecycle-priorities",{"title":288,"path":289,"stem":290},"Проблеми Спільного Стану — Race Condition та Data Race","\u002Fcsharp\u002Fsystem-programming-windows\u002Fshared-state-problems","01.csharp\u002F07.system-programming-windows\u002F05.shared-state-problems",{"title":292,"path":293,"stem":294},"Проблеми Спільного Стану — Memory Model та volatile","\u002Fcsharp\u002Fsystem-programming-windows\u002F05a.shared-state-memory-model","01.csharp\u002F07.system-programming-windows\u002F05a.shared-state-memory-model",{"title":296,"path":297,"stem":298},"Синхронізація — Monitor, lock та еволюція примітивів","\u002Fcsharp\u002Fsystem-programming-windows\u002Fsynchronization-fundamentals","01.csharp\u002F07.system-programming-windows\u002F06.synchronization-fundamentals",{"title":300,"path":301,"stem":302},"Синхронізація — Наскрізний Приклад та Deadlock Detection","\u002Fcsharp\u002Fsystem-programming-windows\u002F06a.synchronization-walkthrough","01.csharp\u002F07.system-programming-windows\u002F06a.synchronization-walkthrough",{"title":304,"path":305,"stem":306},"Синхронізація — Mutex, Semaphore та Event-Based Primitives","\u002Fcsharp\u002Fsystem-programming-windows\u002Fsynchronization-advanced","01.csharp\u002F07.system-programming-windows\u002F07.synchronization-advanced",{"title":308,"path":309,"stem":310},"Синхронізація — Interlocked, Volatile та Lock-Free Структури","\u002Fcsharp\u002Fsystem-programming-windows\u002F07a.synchronization-advanced-walkthrough","01.csharp\u002F07.system-programming-windows\u002F07a.synchronization-advanced-walkthrough",{"title":312,"path":313,"stem":314},"Interlocked, CAS та Lock-Free Структури","\u002Fcsharp\u002Fsystem-programming-windows\u002Finterlocked-cas-lockfree","01.csharp\u002F07.system-programming-windows\u002F08.interlocked-cas-lockfree",{"title":316,"path":317,"stem":318},"Volatile, Memory Model та Spinning","\u002Fcsharp\u002Fsystem-programming-windows\u002F08a.volatile-memory-model","01.csharp\u002F07.system-programming-windows\u002F08a.volatile-memory-model",{"title":320,"path":321,"stem":322},"ThreadPool — Пул Потоків для Ефективного Виконання","\u002Fcsharp\u002Fsystem-programming-windows\u002Fthread-pool","01.csharp\u002F07.system-programming-windows\u002F09.thread-pool",{"title":324,"path":325,"stem":326},"ThreadPool — Просунуті Сценарії та Внутрішня Будова","\u002Fcsharp\u002Fsystem-programming-windows\u002F09a.thread-pool-advanced","01.csharp\u002F07.system-programming-windows\u002F09a.thread-pool-advanced",{"title":328,"path":329,"stem":330},"Concurrent та Immutable Collections","\u002Fcsharp\u002Fsystem-programming-windows\u002Fconcurrent-collections","01.csharp\u002F07.system-programming-windows\u002F10.concurrent-collections",{"title":332,"path":333,"stem":334},"TPL, Task та Композиція — Від Thread до Task","\u002Fcsharp\u002Fsystem-programming-windows\u002Ftpl-parallel-plinq","01.csharp\u002F07.system-programming-windows\u002F11.tpl-parallel-plinq",{"title":336,"path":337,"stem":338},"Parallel Class та PLINQ — Data Parallelism","\u002Fcsharp\u002Fsystem-programming-windows\u002F11a.tpl-parallel-plinq-advanced","01.csharp\u002F07.system-programming-windows\u002F11a.tpl-parallel-plinq-advanced",{"title":340,"path":341,"stem":342},"Async\u002FAwait — Фундамент Асинхронного Програмування","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-fundamentals","01.csharp\u002F07.system-programming-windows\u002F12.async-fundamentals",{"title":344,"path":345,"stem":346},"SynchronizationContext та ConfigureAwait — Контекст Виконання","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-context-configureawait","01.csharp\u002F07.system-programming-windows\u002F13.async-context-configureawait",{"title":348,"path":349,"stem":350},"Async — Просунуті Паттерни","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-advanced","01.csharp\u002F07.system-programming-windows\u002F14.async-advanced",{"title":352,"path":353,"stem":354},"System.Threading.Channels — Async Producer-Consumer","\u002Fcsharp\u002Fsystem-programming-windows\u002Fchannels","01.csharp\u002F07.system-programming-windows\u002F15.channels",{"title":356,"path":357,"stem":358},"Асинхронна Синхронізація","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-synchronization","01.csharp\u002F07.system-programming-windows\u002F16.async-synchronization",{"title":360,"path":361,"stem":362},"Unsafe Code та Вказівники","\u002Fcsharp\u002Fsystem-programming-windows\u002Funsafe-code","01.csharp\u002F07.system-programming-windows\u002F17.unsafe-code",{"title":364,"path":365,"stem":366},"P\u002FInvoke та Windows API — Міст між .NET та Native Code","\u002Fcsharp\u002Fsystem-programming-windows\u002Fpinvoke-winapi","01.csharp\u002F07.system-programming-windows\u002F18.pinvoke-winapi",{"title":368,"path":369,"stem":370},"Реєстр Windows — Центральна База Конфігурації Системи","\u002Fcsharp\u002Fsystem-programming-windows\u002Fwindows-registry","01.csharp\u002F07.system-programming-windows\u002F19.windows-registry",{"title":372,"path":373,"stem":374},"Windows Hooks, Hotkeys та Services — Глибока Інтеграція з ОС","\u002Fcsharp\u002Fsystem-programming-windows\u002Fwindows-hooks-services","01.csharp\u002F07.system-programming-windows\u002F20.windows-hooks-services",{"title":376,"path":377,"stem":378},"Системне Програмування C# (Windows) — 07.system-programming-windows","\u002Fcsharp\u002Fsystem-programming-windows\u002Fimplementation_plan","01.csharp\u002F07.system-programming-windows\u002Fimplementation_plan",{"title":380,"icon":132,"path":381,"stem":382,"children":383,"page":59},"Io","\u002Fcsharp\u002Fio","01.csharp\u002F08.io",[384,388,392,396,400],{"title":385,"path":386,"stem":387},"8.1.1. Основи роботи з файловою системою","\u002Fcsharp\u002Fio\u002Ffile-system-basics","01.csharp\u002F08.io\u002F01.file-system-basics",{"title":389,"path":390,"stem":391},"8.1.2. Потоки (Streams) та Серіалізація Даних","\u002Fcsharp\u002Fio\u002Fstreams-serialization","01.csharp\u002F08.io\u002F02.streams-serialization",{"title":393,"path":394,"stem":395},"8.2.1. JSON Serialization з System.Text.Json","\u002Fcsharp\u002Fio\u002Fjson-serialization","01.csharp\u002F08.io\u002F03.json-serialization",{"title":397,"path":398,"stem":399},"8.2.2. XML Serialization та LINQ to XML","\u002Fcsharp\u002Fio\u002Fxml-serialization","01.csharp\u002F08.io\u002F04.xml-serialization",{"title":401,"path":402,"stem":403},"8.2.3. Binary Serialization: MessagePack та Protocol Buffers","\u002Fcsharp\u002Fio\u002Fbinary-serialization","01.csharp\u002F08.io\u002F05.binary-serialization",{"title":405,"icon":132,"path":406,"stem":407,"children":408,"page":59},"Ado Net","\u002Fcsharp\u002Fado-net","01.csharp\u002F09.ado-net",[409,413,417,421,425,429,433,437,441,445,449,453],{"title":410,"path":411,"stem":412},"9.1. Введення в ADO.NET","\u002Fcsharp\u002Fado-net\u002Fintroduction-to-adonet","01.csharp\u002F09.ado-net\u002F01.introduction-to-adonet",{"title":414,"path":415,"stem":416},"9.2. Клас DbConnection — з'єднання з базою даних","\u002Fcsharp\u002Fado-net\u002Fconnection","01.csharp\u002F09.ado-net\u002F02.connection",{"title":418,"path":419,"stem":420},"9.3. Клас DbCommand — виконання SQL-запитів","\u002Fcsharp\u002Fado-net\u002Fcommand-and-queries","01.csharp\u002F09.ado-net\u002F03.command-and-queries",{"title":422,"path":423,"stem":424},"9.4. Клас DbDataReader — ефективне читання даних","\u002Fcsharp\u002Fado-net\u002Fdatareader","01.csharp\u002F09.ado-net\u002F04.datareader",{"title":426,"path":427,"stem":428},"9.5. Параметризовані запити та захист від SQL Injection","\u002Fcsharp\u002Fado-net\u002Fparameters-and-sql-injection","01.csharp\u002F09.ado-net\u002F05.parameters-and-sql-injection",{"title":430,"path":431,"stem":432},"9.6. Транзакції в ADO.NET","\u002Fcsharp\u002Fado-net\u002Ftransactions","01.csharp\u002F09.ado-net\u002F06.transactions",{"title":434,"path":435,"stem":436},"9.7. DbProviderFactory — провайдер-незалежний код","\u002Fcsharp\u002Fado-net\u002Fprovider-factory","01.csharp\u002F09.ado-net\u002F07.provider-factory",{"title":438,"path":439,"stem":440},"9.8. Асинхронний доступ до даних","\u002Fcsharp\u002Fado-net\u002Fasync-data-access","01.csharp\u002F09.ado-net\u002F08.async-data-access",{"title":442,"path":443,"stem":444},"9.9. Від'єднаний режим: DataSet, DataTable, DataRow","\u002Fcsharp\u002Fado-net\u002Fdisconnected-mode-dataset","01.csharp\u002F09.ado-net\u002F09.disconnected-mode-dataset",{"title":446,"path":447,"stem":448},"9.10. DataAdapter — міст між DataSet та базою даних","\u002Fcsharp\u002Fado-net\u002Fdata-adapter","01.csharp\u002F09.ado-net\u002F10.data-adapter",{"title":450,"path":451,"stem":452},"9.11. Data Mapper та Repository: Архітектура доступу до даних","\u002Fcsharp\u002Fado-net\u002Fdata-mapper-repository","01.csharp\u002F09.ado-net\u002F11.data-mapper-repository",{"title":454,"path":455,"stem":456},"9.12. Identity Map, Unit of Work та Specification Pattern","\u002Fcsharp\u002Fado-net\u002Fadvanced-patterns","01.csharp\u002F09.ado-net\u002F12.advanced-patterns",{"title":458,"icon":255,"path":459,"stem":460,"children":461,"page":59},"Ef Core","\u002Fcsharp\u002Fef-core","01.csharp\u002F10.ef-core",[462,466,470,474,478,482,486,490,494,498,502,506,510,514,518,522,526,532,538,542,546,550,554,558,562,566,570,574,578,582,586,590,594,598,602,606,610,614,618,622,626,630,634,638,642,646],{"title":463,"path":464,"stem":465},"Що таке ORM? Від SQL до об'єктів","\u002Fcsharp\u002Fef-core\u002Fwhat-is-orm","01.csharp\u002F10.ef-core\u002F01.what-is-orm",{"title":467,"path":468,"stem":469},"Перший проєкт — від нуля до CRUD","\u002Fcsharp\u002Fef-core\u002Ffirst-project","01.csharp\u002F10.ef-core\u002F02.first-project",{"title":471,"path":472,"stem":473},"DbContext — Серце EF Core","\u002Fcsharp\u002Fef-core\u002Fdbcontext-deep-dive","01.csharp\u002F10.ef-core\u002F03.dbcontext-deep-dive",{"title":475,"path":476,"stem":477},"Провайдери баз даних — Архітектура та Вибір СУБД","\u002Fcsharp\u002Fef-core\u002Fdatabase-providers","01.csharp\u002F10.ef-core\u002F04.database-providers",{"title":479,"path":480,"stem":481},"Конвенції EF Core — Магія без конфігурації","\u002Fcsharp\u002Fef-core\u002Fconventions","01.csharp\u002F10.ef-core\u002F05.conventions",{"title":483,"path":484,"stem":485},"Fluent API та Data Annotations — Явна конфігурація моделі","\u002Fcsharp\u002Fef-core\u002Ffluent-api-vs-annotations","01.csharp\u002F10.ef-core\u002F06.fluent-api-vs-annotations",{"title":487,"path":488,"stem":489},"Зв'язки — One-to-One та One-to-Many","\u002Fcsharp\u002Fef-core\u002Frelationships-basics","01.csharp\u002F10.ef-core\u002F07.relationships-basics",{"title":491,"path":492,"stem":493},"Зв'язки Advanced — Many-to-Many та Складні Сценарії","\u002Fcsharp\u002Fef-core\u002Frelationships-advanced","01.csharp\u002F10.ef-core\u002F08.relationships-advanced",{"title":495,"path":496,"stem":497},"Властивості — Типи, Конвертери, Компаратори (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fproperty-configuration-part1","01.csharp\u002F10.ef-core\u002F09.property-configuration-part1",{"title":499,"path":500,"stem":501},"Властивості — Value Comparers, Generators, Shadow Properties (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fproperty-configuration-part2","01.csharp\u002F10.ef-core\u002F09.property-configuration-part2",{"title":503,"path":504,"stem":505},"Складні типи — Owned Types та Complex Types (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fcomplex-types-owned-part1","01.csharp\u002F10.ef-core\u002F10.complex-types-owned-part1",{"title":507,"path":508,"stem":509},"Складні типи — Complex Types, Keyless Entities, Порівняння (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fcomplex-types-owned-part2","01.csharp\u002F10.ef-core\u002F10.complex-types-owned-part2",{"title":511,"path":512,"stem":513},"JSON Columns — Складні дані у JSON (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fjson-columns-part1","01.csharp\u002F10.ef-core\u002F11.json-columns-part1",{"title":515,"path":516,"stem":517},"JSON Columns — Value Comparers, Індекси, Провайдери (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fjson-columns-part2","01.csharp\u002F10.ef-core\u002F11.json-columns-part2",{"title":519,"path":520,"stem":521},"Успадкування — Абстрактні класи та TPH (Частина 1)","\u002Fcsharp\u002Fef-core\u002Finheritance-part1","01.csharp\u002F10.ef-core\u002F12.inheritance-part1",{"title":523,"path":524,"stem":525},"Успадкування — TPT, TPC та Порівняння Стратегій (Частина 2)","\u002Fcsharp\u002Fef-core\u002Finheritance-part2","01.csharp\u002F10.ef-core\u002F12.inheritance-part2",{"title":527,"path":528,"stem":529,"children":530},"Індекси, Обмеження та Схема (Частина 1)","\u002Fcsharp\u002Fef-core\u002Findexes-constraints-part1","01.csharp\u002F10.ef-core\u002F13.indexes-constraints-part1",[531],{"title":527,"path":528,"stem":529},{"title":533,"path":534,"stem":535,"children":536},"Індекси, Обмеження та Схема (Частина 2)","\u002Fcsharp\u002Fef-core\u002Findexes-constraints-part2","01.csharp\u002F10.ef-core\u002F13.indexes-constraints-part2",[537],{"title":533,"path":534,"stem":535},{"title":539,"path":540,"stem":541},"Seed Data — Початкові Дані (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fseeding-part1","01.csharp\u002F10.ef-core\u002F14.seeding-part1",{"title":543,"path":544,"stem":545},"Seed Data — SQL-скрипти, Bogus та Стратегії (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fseeding-part2","01.csharp\u002F10.ef-core\u002F14.seeding-part2",{"title":547,"path":548,"stem":549},"Global Query Filters — Глобальні Фільтри (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fglobal-query-filters-part1","01.csharp\u002F10.ef-core\u002F15.global-query-filters-part1",{"title":551,"path":552,"stem":553},"Global Query Filters — Підводні камені та Інтеграція (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fglobal-query-filters-part2","01.csharp\u002F10.ef-core\u002F15.global-query-filters-part2",{"title":555,"path":556,"stem":557},"LINQ-запити в EF Core (Частина 1)","\u002Fcsharp\u002Fef-core\u002Flinq-queries-part1","01.csharp\u002F10.ef-core\u002F16.linq-queries-part1",{"title":559,"path":560,"stem":561},"LINQ-запити в EF Core (Частина 2)","\u002Fcsharp\u002Fef-core\u002Flinq-queries-part2","01.csharp\u002F10.ef-core\u002F16.linq-queries-part2",{"title":563,"path":564,"stem":565},"Завантаження Пов'язаних Даних (Частина 1)","\u002Fcsharp\u002Fef-core\u002Floading-related-data-part1","01.csharp\u002F10.ef-core\u002F17.loading-related-data-part1",{"title":567,"path":568,"stem":569},"Завантаження Пов'язаних Даних (Частина 2)","\u002Fcsharp\u002Fef-core\u002Floading-related-data-part2","01.csharp\u002F10.ef-core\u002F17.loading-related-data-part2",{"title":571,"path":572,"stem":573},"Raw SQL, Views та Stored Procedures (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fraw-sql-part1","01.csharp\u002F10.ef-core\u002F18.raw-sql-part1",{"title":575,"path":576,"stem":577},"Raw SQL — Stored Procedures, DbFunction та Bulk Operations (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fraw-sql-part2","01.csharp\u002F10.ef-core\u002F18.raw-sql-part2",{"title":579,"path":580,"stem":581},"Продвинуті Запити — Compiled Queries, Bulk та Оптимізація (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fadvanced-queries-part1","01.csharp\u002F10.ef-core\u002F19.advanced-queries-part1",{"title":583,"path":584,"stem":585},"Продвинуті Запити — Query Tags, Bulk та Interceptors (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fadvanced-queries-part2","01.csharp\u002F10.ef-core\u002F19.advanced-queries-part2",{"title":587,"path":588,"stem":589},"Change Tracker — Відстеження Змін (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fchange-tracking-part1","01.csharp\u002F10.ef-core\u002F20.change-tracking-part1",{"title":591,"path":592,"stem":593},"Change Tracker — Графи Об'єктів та Disconnected (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fchange-tracking-part2","01.csharp\u002F10.ef-core\u002F20.change-tracking-part2",{"title":595,"path":596,"stem":597},"Збереження Даних та Транзакції (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fsaving-data-part1","01.csharp\u002F10.ef-core\u002F21.saving-data-part1",{"title":599,"path":600,"stem":601},"Збереження Даних — Concurrency та Outbox (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fsaving-data-part2","01.csharp\u002F10.ef-core\u002F21.saving-data-part2",{"title":603,"path":604,"stem":605},"Конкурентність та Блокування (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fconcurrency-part1","01.csharp\u002F10.ef-core\u002F22.concurrency-part1",{"title":607,"path":608,"stem":609},"Конкурентність — Дедлоки та Queue Processing (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fconcurrency-part2","01.csharp\u002F10.ef-core\u002F22.concurrency-part2",{"title":611,"path":612,"stem":613},"Міграції в EF Core — Основи (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fmigrations-basics-part1","01.csharp\u002F10.ef-core\u002F23.migrations-basics-part1",{"title":615,"path":616,"stem":617},"Міграції в EF Core — Основи (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fmigrations-basics-part2","01.csharp\u002F10.ef-core\u002F23.migrations-basics-part2",{"title":619,"path":620,"stem":621},"Міграції — Просунуті Сценарії (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fmigrations-advanced-part1","01.csharp\u002F10.ef-core\u002F24.migrations-advanced-part1",{"title":623,"path":624,"stem":625},"Міграції — Просунуті Сценарії (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fmigrations-advanced-part2","01.csharp\u002F10.ef-core\u002F24.migrations-advanced-part2",{"title":627,"path":628,"stem":629},"Управління Схемою та Database-First (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fschema-management-part1","01.csharp\u002F10.ef-core\u002F25.schema-management-part1",{"title":631,"path":632,"stem":633},"Управління Схемою та Database-First (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fschema-management-part2","01.csharp\u002F10.ef-core\u002F25.schema-management-part2",{"title":635,"path":636,"stem":637},"Продуктивність EF Core — Основи (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fperformance-fundamentals-part1","01.csharp\u002F10.ef-core\u002F26.performance-fundamentals-part1",{"title":639,"path":640,"stem":641},"Interceptors в EF Core (Частина 1)","\u002Fcsharp\u002Fef-core\u002Finterceptors-part1","01.csharp\u002F10.ef-core\u002F29.interceptors-part1",{"title":643,"path":644,"stem":645},"Interceptors в EF Core — Connection, Transaction та Materialization (Частина 2)","\u002Fcsharp\u002Fef-core\u002Finterceptors-part2","01.csharp\u002F10.ef-core\u002F29.interceptors-part2",{"title":647,"path":648,"stem":649},"План вивчення Entity Framework Core — Повний курс","\u002Fcsharp\u002Fef-core\u002Fimplementation_plan","01.csharp\u002F10.ef-core\u002Fimplementation_plan",{"title":651,"icon":652,"path":653,"stem":654,"children":655,"page":59},"ASP.NET","i-devicon-dotnetcore","\u002Fcsharp\u002Faspnet","01.csharp\u002F11.aspnet",[656,730,791,869,927,941,967,1057,1111,1182,1212,1289,1346],{"title":657,"icon":658,"path":659,"stem":660,"children":661,"page":59},"Minimal API","i-lucide-network","\u002Fcsharp\u002Faspnet\u002Fminimal-api","01.csharp\u002F11.aspnet\u002F01.minimal-api",[662,666,670,674,678,682,686,690,694,698,702,706,710,714,718,722,726],{"title":663,"path":664,"stem":665},"Вступ до ASP.NET та еволюція фреймворку","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fintroduction","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F01.introduction",{"title":667,"path":668,"stem":669},"Перший додаток на ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Ffirst-application","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F02.first-application",{"title":671,"path":672,"stem":673},"WebApplication, Builder та Dependency Injection","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fwebapplication-builder","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F03.webapplication-builder",{"title":675,"path":676,"stem":677},"Конвеєр запитів та Middleware","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frequest-pipeline-middleware","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F04.request-pipeline-middleware",{"title":679,"path":680,"stem":681},"Маршрутизація в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frouting-basics","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F05.routing-basics",{"title":683,"path":684,"stem":685},"Маршрутизація в ASP.NET Core: Розширені можливості","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frouting-advanced","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F06.routing-advanced",{"title":687,"path":688,"stem":689},"Статичні файли в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstatic-files","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F07.static-files",{"title":691,"path":692,"stem":693},"Статичні Активи: MapStaticAssets (ASP.NET Core 9.0)","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstatic-assets","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F08.static-assets",{"title":695,"path":696,"stem":697},"Конфігурація в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fconfiguration-fundamentals","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F09.configuration-fundamentals",{"title":699,"path":700,"stem":701},"Конфігурація: Паттерн Options","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fconfiguration-options","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F10.configuration-options",{"title":703,"path":704,"stem":705},"Логування в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Flogging-basics","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F11.logging-basics",{"title":707,"path":708,"stem":709},"Логування: Serilog та Middleware","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Flogging-advanced","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F12.logging-advanced",{"title":711,"path":712,"stem":713},"Управління станом: HttpContext.Items та Cookies","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstate-management","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F13.state-management",{"title":715,"path":716,"stem":717},"Стан сесії: Sessions","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fsession-state","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F14.session-state",{"title":719,"path":720,"stem":721},"Структура проєкту: від хаосу до архітектури","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fproject-structure","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F15.project-structure",{"title":723,"path":724,"stem":725},"Scalar у Minimal API: повний проєкт і Fluent OpenAPI","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fscalar-openapi-fluent","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F16.scalar-openapi-fluent",{"title":727,"path":728,"stem":729},"Swagger \u002F Swashbuckle у Minimal API: окремий класичний шлях","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fswagger-swashbuckle","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F17.swagger-swashbuckle",{"title":731,"icon":658,"path":732,"stem":733,"children":734,"page":59},"API","\u002Fcsharp\u002Faspnet\u002Fapi","01.csharp\u002F11.aspnet\u002F02.api",[735,739,743,747,751,755,759,763,767,771,775,779,783,787],{"title":736,"path":737,"stem":738},"Що таке API. Клієнт-серверна архітектура","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fwhat-is-api","01.csharp\u002F11.aspnet\u002F02.api\u002F01.what-is-api",{"title":740,"path":741,"stem":742},"Формати даних: JSON, XML, TOML та бінарні формати","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fdata-formats","01.csharp\u002F11.aspnet\u002F02.api\u002F02.data-formats",{"title":744,"path":745,"stem":746},"Парадигми API та концепція REST","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-paradigms-rest","01.csharp\u002F11.aspnet\u002F02.api\u002F03.api-paradigms-rest",{"title":748,"path":749,"stem":750},"HTTP-методи, статус-коди та заголовки","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fhttp-methods-status-codes","01.csharp\u002F11.aspnet\u002F02.api\u002F04.http-methods-status-codes",{"title":752,"path":753,"stem":754},"Організація HTTP API за принципами REST","\u002Fcsharp\u002Faspnet\u002Fapi\u002Frest-organizing","01.csharp\u002F11.aspnet\u002F02.api\u002F05.rest-organizing",{"title":756,"path":757,"stem":758},"Номенклатура URL та CRUD-операції","\u002Fcsharp\u002Faspnet\u002Fapi\u002Furl-nomenclature-crud","01.csharp\u002F11.aspnet\u002F02.api\u002F06.url-nomenclature-crud",{"title":760,"path":761,"stem":762},"Правила дизайну: іменування та стандарти","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-naming","01.csharp\u002F11.aspnet\u002F02.api\u002F07.api-design-naming",{"title":764,"path":765,"stem":766},"Валідація, ліміти та обробка помилок","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-validation","01.csharp\u002F11.aspnet\u002F02.api\u002F08.api-design-validation",{"title":768,"path":769,"stem":770},"Обробка помилок у Minimal API","\u002Fcsharp\u002Faspnet\u002Fapi\u002Ferror-handling-http","01.csharp\u002F11.aspnet\u002F02.api\u002F09.error-handling-http",{"title":772,"path":773,"stem":774},"Ідемпотентність та синхронізація стану","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fidempotency-sync","01.csharp\u002F11.aspnet\u002F02.api\u002F10.idempotency-sync",{"title":776,"path":777,"stem":778},"Пагінація та організація списків","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fpagination-lists","01.csharp\u002F11.aspnet\u002F02.api\u002F11.pagination-lists",{"title":780,"path":781,"stem":782},"Безпека API, кешування та інтернаціоналізація","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fsecurity-auth","01.csharp\u002F11.aspnet\u002F02.api\u002F12.security-auth",{"title":784,"path":785,"stem":786},"Процес проєктування API та документування","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-process","01.csharp\u002F11.aspnet\u002F02.api\u002F13.api-design-process",{"title":788,"path":789,"stem":790},"OpenAPI: контракт, специфікація та документація API","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fopenapi","01.csharp\u002F11.aspnet\u002F02.api\u002F14.openapi",{"title":792,"icon":793,"path":794,"stem":795,"children":796,"page":59},"Auth","i-lucide-shield-check","\u002Fcsharp\u002Faspnet\u002Fauth","01.csharp\u002F11.aspnet\u002F03.auth",[797,801,805,809,813,817,821,825,829,833,837,841,845,849,853,857,861,865],{"title":798,"path":799,"stem":800},"Основи аутентифікації та авторизації","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fauth-fundamentals","01.csharp\u002F11.aspnet\u002F03.auth\u002F01.auth-fundamentals",{"title":802,"path":803,"stem":804},"JWT-аутентифікація","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fjwt-authentication","01.csharp\u002F11.aspnet\u002F03.auth\u002F02.jwt-authentication",{"title":806,"path":807,"stem":808},"Авторизація: ролі, політики та resource-based доступ","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fauthorization-policies","01.csharp\u002F11.aspnet\u002F03.auth\u002F03.authorization-policies",{"title":810,"path":811,"stem":812},"Cookie-аутентифікація та ASP.NET Core Identity","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fcookie-auth-identity","01.csharp\u002F11.aspnet\u002F03.auth\u002F04.cookie-auth-identity",{"title":814,"path":815,"stem":816},"JWT + Refresh Tokens (HttpOnly Cookie)","\u002Fcsharp\u002Faspnet\u002Fauth\u002F04b.identity-auth-jwt","01.csharp\u002F11.aspnet\u002F03.auth\u002F04b.identity-auth-jwt",{"title":818,"path":819,"stem":820},"Identity: Підтвердження Email та Скидання Пароля","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-email-confirmation","01.csharp\u002F11.aspnet\u002F03.auth\u002F05.identity-email-confirmation",{"title":822,"path":823,"stem":824},"Identity: Двофакторна Аутентифікація (2FA)","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-two-factor","01.csharp\u002F11.aspnet\u002F03.auth\u002F06.identity-two-factor",{"title":826,"path":827,"stem":828},"Identity: Внутрішня Архітектура та Кастомізація","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-internals","01.csharp\u002F11.aspnet\u002F03.auth\u002F07.identity-internals",{"title":830,"path":831,"stem":832},"OAuth 2.0 та зовнішні провайдери","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foauth-external-providers","01.csharp\u002F11.aspnet\u002F03.auth\u002F08.oauth-external-providers",{"title":834,"path":835,"stem":836},"Безпека на практиці: CORS, HTTPS та захист від атак","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fsecurity-hardening","01.csharp\u002F11.aspnet\u002F03.auth\u002F09.security-hardening",{"title":838,"path":839,"stem":840},"Теорія OAuth 2.0: Поняття, Аналогії та Флоу","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foauth-theory","01.csharp\u002F11.aspnet\u002F03.auth\u002F10.oauth-theory",{"title":842,"path":843,"stem":844},"OIDC, OAuth 2.0 та Keycloak в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foidc-keycloak","01.csharp\u002F11.aspnet\u002F03.auth\u002F10.oidc-keycloak",{"title":846,"path":847,"stem":848},"API Keys аутентифікація в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fapi-keys","01.csharp\u002F11.aspnet\u002F03.auth\u002F11.api-keys",{"title":850,"path":851,"stem":852},"Rate Limiting та Throttling в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frate-limiting","01.csharp\u002F11.aspnet\u002F03.auth\u002F12.rate-limiting",{"title":854,"path":855,"stem":856},"Refresh Token Rotation в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frefresh-token-rotation","01.csharp\u002F11.aspnet\u002F03.auth\u002F13.refresh-token-rotation",{"title":858,"path":859,"stem":860},"Certificate Authentication та mTLS в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fcertificate-auth","01.csharp\u002F11.aspnet\u002F03.auth\u002F14.certificate-auth",{"title":862,"path":863,"stem":864},"RBAC, ABAC та ReBAC в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frbac-abac-rebac","01.csharp\u002F11.aspnet\u002F03.auth\u002F15.rbac-abac-rebac",{"title":866,"path":867,"stem":868},"Multi-tenancy та ізоляція даних в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fmulti-tenancy","01.csharp\u002F11.aspnet\u002F03.auth\u002F16.multi-tenancy",{"title":870,"icon":871,"path":872,"stem":873,"children":874,"page":59},"Нотифікації","i-lucide-bell","\u002Fcsharp\u002Faspnet\u002Fnotifications","01.csharp\u002F11.aspnet\u002F04.notifications",[875,879,883,887,891,895,899,903,907,911,915,919,923],{"title":876,"path":877,"stem":878},"In-App нотифікації через базу даних","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fin-app-database-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F01.in-app-database-notifications",{"title":880,"path":881,"stem":882},"Polling: Регулярний запит оновлень","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fpolling","01.csharp\u002F11.aspnet\u002F04.notifications\u002F02.polling",{"title":884,"path":885,"stem":886},"Server-Sent Events: Однострімовий push від сервера","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fserver-sent-events","01.csharp\u002F11.aspnet\u002F04.notifications\u002F03.server-sent-events",{"title":888,"path":889,"stem":890},"WebSockets: Двостороннє з'єднання в реальному часі","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fwebsockets","01.csharp\u002F11.aspnet\u002F04.notifications\u002F04.websockets",{"title":892,"path":893,"stem":894},"SignalR: Абстракція над транспортами реального часу","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fsignalr","01.csharp\u002F11.aspnet\u002F04.notifications\u002F05.signalr",{"title":896,"path":897,"stem":898},"Background Services: Фонові задачі в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fbackground-services","01.csharp\u002F11.aspnet\u002F04.notifications\u002F06.background-services",{"title":900,"path":901,"stem":902},"Web Push нотифікації","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fweb-push","01.csharp\u002F11.aspnet\u002F04.notifications\u002F07.web-push",{"title":904,"path":905,"stem":906},"Email нотифікації","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Femail-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F08.email-notifications",{"title":908,"path":909,"stem":910},"Порівняння підходів: Як вибрати правильну технологію нотифікацій","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fchoosing-the-right-approach","01.csharp\u002F11.aspnet\u002F04.notifications\u002F09.choosing-the-right-approach",{"title":912,"path":913,"stem":914},"Hangfire: Надійне планування фонових задач","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire","01.csharp\u002F11.aspnet\u002F04.notifications\u002F10.hangfire",{"title":916,"path":917,"stem":918},"Практика: Конвертація зображень у WebP через Hangfire","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire-image-webp","01.csharp\u002F11.aspnet\u002F04.notifications\u002F11.hangfire-image-webp",{"title":920,"path":921,"stem":922},"Практика: Підготовка відео до HLS-стрімінгу через Hangfire","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire-video-hls","01.csharp\u002F11.aspnet\u002F04.notifications\u002F12.hangfire-video-hls",{"title":924,"path":925,"stem":926},"Telegram-нотифікації: від одного повідомлення до масових розсилок і мульти-канального підходу","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Ftelegram-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F13.telegram-notifications",{"title":928,"icon":929,"path":930,"stem":931,"children":932,"page":59},"Інтернаціоналізація","i-lucide-languages","\u002Fcsharp\u002Faspnet\u002Fi18n","01.csharp\u002F11.aspnet\u002F05.i18n",[933,937],{"title":934,"path":935,"stem":936},"Інтернаціоналізація (i18n) у Minimal API: від A до Я","\u002Fcsharp\u002Faspnet\u002Fi18n\u002Finternationalization","01.csharp\u002F11.aspnet\u002F05.i18n\u002F01.internationalization",{"title":938,"path":939,"stem":940},"Humanizer: людиномовні рядки у .NET","\u002Fcsharp\u002Faspnet\u002Fi18n\u002Fhumanizer","01.csharp\u002F11.aspnet\u002F05.i18n\u002F02.humanizer",{"title":942,"icon":943,"path":944,"stem":945,"children":946,"page":59},"Кешування","i-lucide-layers","\u002Fcsharp\u002Faspnet\u002Fcaching","01.csharp\u002F11.aspnet\u002F06.caching",[947,951,955,959,963],{"title":948,"path":949,"stem":950},"Огляд кешування: чотири рівні і коли що обирати","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fcaching","01.csharp\u002F11.aspnet\u002F06.caching\u002F01.caching",{"title":952,"path":953,"stem":954},"IMemoryCache: кеш в оперативній пам'яті","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fmemory-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F02.memory-cache",{"title":956,"path":957,"stem":958},"IDistributedCache і Redis: розподілений кеш","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fdistributed-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F03.distributed-cache",{"title":960,"path":961,"stem":962},"Response Cache: HTTP-кешування через Cache-Control","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fresponse-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F04.response-cache",{"title":964,"path":965,"stem":966},"Output Cache: серверний кеш HTTP-відповідей (.NET 7+)","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Foutput-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F05.output-cache",{"title":968,"icon":969,"path":970,"stem":971,"children":972,"page":59},"Тестування","i-lucide-test-tube","\u002Fcsharp\u002Faspnet\u002Ftesting","01.csharp\u002F11.aspnet\u002F07.testing",[973,977,981,985,989,993,997,1001,1005,1009,1013,1017,1021,1025,1029,1033,1037,1041,1045,1049,1053],{"title":974,"path":975,"stem":976},"Що таке тестування? Від інтуїції до науки","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwhat-is-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F01.what-is-testing",{"title":978,"path":979,"stem":980},"Піраміда тестування — Стратегія, а не Догма","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-pyramid","01.csharp\u002F11.aspnet\u002F07.testing\u002F02.testing-pyramid",{"title":982,"path":983,"stem":984},"Дві Школи Тестування — Лондон проти Детройту","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-schools","01.csharp\u002F11.aspnet\u002F07.testing\u002F03.testing-schools",{"title":986,"path":987,"stem":988},"TDD та BDD — Тести як Дизайн-інструмент","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftdd-and-bdd","01.csharp\u002F11.aspnet\u002F07.testing\u002F04.tdd-and-bdd",{"title":990,"path":991,"stem":992},"Що саме тестувати — Техніки аналізу та Циклomatична складність","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwhat-to-test","01.csharp\u002F11.aspnet\u002F07.testing\u002F05.what-to-test",{"title":994,"path":995,"stem":996},"Тестові Фреймворки — Навіщо вони і що всередині","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftest-frameworks","01.csharp\u002F11.aspnet\u002F07.testing\u002F06.test-frameworks",{"title":998,"path":999,"stem":1000},"xUnit — Факти, Теорії та Lifecycle тестів","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fxunit-basics","01.csharp\u002F11.aspnet\u002F07.testing\u002F07.xunit-basics",{"title":1002,"path":1003,"stem":1004},"xUnit Advanced — Fixtures, Кастомізація та Розширення","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fxunit-advanced","01.csharp\u002F11.aspnet\u002F07.testing\u002F08.xunit-advanced",{"title":1006,"path":1007,"stem":1008},"Moq — Глибоке занурення в мокування","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fmocking-with-moq","01.csharp\u002F11.aspnet\u002F07.testing\u002F09.mocking-with-moq",{"title":1010,"path":1011,"stem":1012},"Тестування Баз Даних — EF Core, SQLite та Testcontainers","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fdatabase-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F10.database-testing",{"title":1014,"path":1015,"stem":1016},"Integration Testing — Частина 1 [Теорія та WebApplicationFactory]","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fintegration-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F11.integration-testing",{"title":1018,"path":1019,"stem":1020},"Інтеграційне тестування — Практика","\u002Fcsharp\u002Faspnet\u002Ftesting\u002F11a.integration-testing-practice","01.csharp\u002F11.aspnet\u002F07.testing\u002F11a.integration-testing-practice",{"title":1022,"path":1023,"stem":1024},"Integration Testing — Частина 2 [Просунуті Сценарії та Testcontainers]","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fintegration-testing-advanced","01.csharp\u002F11.aspnet\u002F07.testing\u002F12.integration-testing-advanced",{"title":1026,"path":1027,"stem":1028},"Професійний Postman: Колекції, Змінні та GitHub Інтеграція","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fpostman-professional","01.csharp\u002F11.aspnet\u002F07.testing\u002F13.postman-professional",{"title":1030,"path":1031,"stem":1032},"HttpClient у Тестах Частина 1: Архітектура та MockHttpMessageHandler","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fhttpclient-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F14.httpclient-testing",{"title":1034,"path":1035,"stem":1036},"HttpClient у Тестах Частина 2: WireMock.Net та Resilience","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwiremock-net","01.csharp\u002F11.aspnet\u002F07.testing\u002F15.wiremock-net",{"title":1038,"path":1039,"stem":1040},"Патерни та Анти-патерни Тестування: Test Smells","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-patterns","01.csharp\u002F11.aspnet\u002F07.testing\u002F16.testing-patterns",{"title":1042,"path":1043,"stem":1044},"Просунуті інструменти: Time, Snapshots та Властивості","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fadvanced-testing-tools","01.csharp\u002F11.aspnet\u002F07.testing\u002F17.advanced-testing-tools",{"title":1046,"path":1047,"stem":1048},"Тестування Архітектури з NetArchTest","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Farchitecture-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F18.architecture-testing",{"title":1050,"path":1051,"stem":1052},"Тестування Продуктивності: BenchmarkDotNet, NBomber та k6","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fperformance-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F19.performance-testing",{"title":1054,"path":1055,"stem":1056},"Залишок плану для курсу \"Тестування ASP.NET Minimal API\"","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fremaining_plan","01.csharp\u002F11.aspnet\u002F07.testing\u002Fremaining_plan",{"title":1058,"icon":1059,"path":1060,"stem":1061,"children":1062,"page":59},"Платежі","i-lucide-credit-card","\u002Fcsharp\u002Faspnet\u002Fpayments","01.csharp\u002F11.aspnet\u002F08.payments",[1063,1067,1071,1075,1079,1083,1087,1091,1095,1099,1103,1107],{"title":1064,"path":1065,"stem":1066},"Основи платіжної інфраструктури","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-fundamentals","01.csharp\u002F11.aspnet\u002F08.payments\u002F01.payment-fundamentals",{"title":1068,"path":1069,"stem":1070},"Методи оплати в Україні","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-methods-ukraine","01.csharp\u002F11.aspnet\u002F08.payments\u002F02.payment-methods-ukraine",{"title":1072,"path":1073,"stem":1074},"PCI DSS та безпека платежів","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpci-dss-security","01.csharp\u002F11.aspnet\u002F08.payments\u002F03.pci-dss-security",{"title":1076,"path":1077,"stem":1078},"Архітектура платіжної підсистеми","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-architecture","01.csharp\u002F11.aspnet\u002F08.payments\u002F04.payment-architecture",{"title":1080,"path":1081,"stem":1082},"Інтеграція LiqPay (ПриватБанк)","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fliqpay-integration","01.csharp\u002F11.aspnet\u002F08.payments\u002F05.liqpay-integration",{"title":1084,"path":1085,"stem":1086},"Інтеграція Monobank Acquiring API","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fmonobank-acquiring","01.csharp\u002F11.aspnet\u002F08.payments\u002F06.monobank-acquiring",{"title":1088,"path":1089,"stem":1090},"Інтеграція Stripe","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fstripe-integration","01.csharp\u002F11.aspnet\u002F08.payments\u002F07.stripe-integration",{"title":1092,"path":1093,"stem":1094},"Webhooks — глибоке занурення","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fwebhooks-deep-dive","01.csharp\u002F11.aspnet\u002F08.payments\u002F08.webhooks-deep-dive",{"title":1096,"path":1097,"stem":1098},"Підписки та рекурентні платежі","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fsubscriptions-recurring","01.csharp\u002F11.aspnet\u002F08.payments\u002F09.subscriptions-recurring",{"title":1100,"path":1101,"stem":1102},"Повернення коштів та диспути","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Frefunds-disputes","01.csharp\u002F11.aspnet\u002F08.payments\u002F10.refunds-disputes",{"title":1104,"path":1105,"stem":1106},"Тестування платіжних інтеграцій","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Ftesting-payments","01.csharp\u002F11.aspnet\u002F08.payments\u002F11.testing-payments",{"title":1108,"path":1109,"stem":1110},"Чекліст виходу в Production","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fproduction-checklist","01.csharp\u002F11.aspnet\u002F08.payments\u002F12.production-checklist",{"title":1112,"icon":1113,"items":1114,"path":1127,"stem":1128,"children":1129,"page":59},"Популярні бібліотеки","lucide:box",[1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126],"01.fluent-validation","02.mapster","03.erroror-result-pattern","04.serilog","05.mediatr","06.polly","07.health-checks","08.feature-management","09.fluent-email","10.quest-pdf","11.bogus","12.humanizer-guard","\u002Fcsharp\u002Faspnet\u002Flibraries","01.csharp\u002F11.aspnet\u002F09.libraries",[1130,1134,1138,1142,1146,1150,1154,1158,1162,1166,1170,1174,1178],{"title":1131,"path":1132,"stem":1133},"Валідація з FluentValidation в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffluent-validation","01.csharp\u002F11.aspnet\u002F09.libraries\u002F01.fluent-validation",{"title":1135,"path":1136,"stem":1137},"Маппінг об","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fmapster","01.csharp\u002F11.aspnet\u002F09.libraries\u002F02.mapster",{"title":1139,"path":1140,"stem":1141},"Обробка помилок з ErrorOr та Result Pattern в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ferroror-result-pattern","01.csharp\u002F11.aspnet\u002F09.libraries\u002F03.erroror-result-pattern",{"title":1143,"path":1144,"stem":1145},"Структуроване логування з Serilog в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fserilog","01.csharp\u002F11.aspnet\u002F09.libraries\u002F04.serilog",{"title":1147,"path":1148,"stem":1149},"CQRS та Mediator з MediatR в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fmediatr","01.csharp\u002F11.aspnet\u002F09.libraries\u002F05.mediatr",{"title":1151,"path":1152,"stem":1153},"Відмовостійкість з Polly в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fpolly","01.csharp\u002F11.aspnet\u002F09.libraries\u002F06.polly",{"title":1155,"path":1156,"stem":1157},"Health Checks в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fhealth-checks","01.csharp\u002F11.aspnet\u002F09.libraries\u002F07.health-checks",{"title":1159,"path":1160,"stem":1161},"Feature Management та Feature Flags в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffeature-management","01.csharp\u002F11.aspnet\u002F09.libraries\u002F08.feature-management",{"title":1163,"path":1164,"stem":1165},"Відправка Email з FluentEmail в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffluent-email","01.csharp\u002F11.aspnet\u002F09.libraries\u002F09.fluent-email",{"title":1167,"path":1168,"stem":1169},"Генерація PDF з QuestPDF в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fquest-pdf","01.csharp\u002F11.aspnet\u002F09.libraries\u002F10.quest-pdf",{"title":1171,"path":1172,"stem":1173},"Генерація тестових даних з Bogus в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fbogus","01.csharp\u002F11.aspnet\u002F09.libraries\u002F11.bogus",{"title":1175,"path":1176,"stem":1177},"Humanizer та Guard Clauses в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fhumanizer-guard","01.csharp\u002F11.aspnet\u002F09.libraries\u002F12.humanizer-guard",{"title":1179,"path":1180,"stem":1181},"План модуля 10.libraries — Популярні бібліотеки ASP.NET","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fplan","01.csharp\u002F11.aspnet\u002F09.libraries\u002Fplan",{"title":1183,"icon":1184,"path":1185,"stem":1186,"children":1187,"page":59},"Razor Pages","i-lucide-layout-template","\u002Fcsharp\u002Faspnet\u002Frazor-pages","01.csharp\u002F11.aspnet\u002F10.razor-pages",[1188,1192,1196,1200,1204,1208],{"title":1189,"path":1190,"stem":1191},"Від Minimal API до Razor Pages: концептуальний перехід","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Ffrom-minimal-api","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F01.from-minimal-api",{"title":1193,"path":1194,"stem":1195},"PageModel: логіка сторінки Razor Pages","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fpage-model","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F02.page-model",{"title":1197,"path":1198,"stem":1199},"Razor синтаксис: шаблонізатор у .cshtml","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Frazor-syntax","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F03.razor-syntax",{"title":1201,"path":1202,"stem":1203},"Tag Helpers: типізований HTML","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Ftag-helpers","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F04.tag-helpers",{"title":1205,"path":1206,"stem":1207},"Форми і валідація: повний цикл обробки даних","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fforms-validation","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F05.forms-validation",{"title":1209,"path":1210,"stem":1211},"Практичний проєкт: TaskManager на Razor Pages","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fproject-task-manager","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F06.project-task-manager",{"title":1213,"path":1214,"stem":1215,"children":1216,"page":59},"ASP.NET Core MVC","\u002Fcsharp\u002Faspnet\u002Fmvc","01.csharp\u002F11.aspnet\u002F11.mvc",[1217,1221,1225,1229,1233,1237,1241,1245,1249,1253,1257,1261,1265,1269,1273,1277,1281,1285],{"title":1218,"path":1219,"stem":1220},"Патерн MVC: архітектура, що змінила веб","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmvc-pattern","01.csharp\u002F11.aspnet\u002F11.mvc\u002F01.mvc-pattern",{"title":1222,"path":1223,"stem":1224},"Від Razor Pages до MVC: концептуальний перехід","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffrom-razor-pages","01.csharp\u002F11.aspnet\u002F11.mvc\u002F02.from-razor-pages",{"title":1226,"path":1227,"stem":1228},"Controllers та Actions: серце MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fcontrollers-actions","01.csharp\u002F11.aspnet\u002F11.mvc\u002F03.controllers-actions",{"title":1230,"path":1231,"stem":1232},"Маршрутизація в MVC: Convention vs Attribute Routing","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Frouting-mvc","01.csharp\u002F11.aspnet\u002F11.mvc\u002F04.routing-mvc",{"title":1234,"path":1235,"stem":1236},"Model Binding: від HTTP до C#","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmodel-binding","01.csharp\u002F11.aspnet\u002F11.mvc\u002F05.model-binding",{"title":1238,"path":1239,"stem":1240},"Views, ViewData, ViewBag, TempData і ViewModel","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fviews-viewdata-tempdata","01.csharp\u002F11.aspnet\u002F11.mvc\u002F06.views-viewdata-tempdata",{"title":1242,"path":1243,"stem":1244},"Filters: аспектно-орієнтоване програмування в MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffilters","01.csharp\u002F11.aspnet\u002F11.mvc\u002F07.filters",{"title":1246,"path":1247,"stem":1248},"Areas: структурування великих застосунків","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fareas","01.csharp\u002F11.aspnet\u002F11.mvc\u002F08.areas",{"title":1250,"path":1251,"stem":1252},"View Components: повторювані незалежні блоки UI","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fview-components","01.csharp\u002F11.aspnet\u002F11.mvc\u002F09.view-components",{"title":1254,"path":1255,"stem":1256},"Display та Editor Templates","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fdisplay-editor-templates","01.csharp\u002F11.aspnet\u002F11.mvc\u002F10.display-editor-templates",{"title":1258,"path":1259,"stem":1260},"Валідація: IValidatableObject та FluentValidation","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fvalidation-advanced","01.csharp\u002F11.aspnet\u002F11.mvc\u002F11.validation-advanced",{"title":1262,"path":1263,"stem":1264},"HTMX: інтерактивність через HTML-атрибути","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fhtmx","01.csharp\u002F11.aspnet\u002F11.mvc\u002F12.htmx",{"title":1266,"path":1267,"stem":1268},"HTMX у ASP.NET Core MVC: серверна інтеграція","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fajax-htmx-mvc","01.csharp\u002F11.aspnet\u002F11.mvc\u002F13.ajax-htmx-mvc",{"title":1270,"path":1271,"stem":1272},"Практичний проєкт: Каталог товарів з HTMX","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fhtmx-project","01.csharp\u002F11.aspnet\u002F11.mvc\u002F14.htmx-project",{"title":1274,"path":1275,"stem":1276},"Завантаження та обробка файлів","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffile-upload","01.csharp\u002F11.aspnet\u002F11.mvc\u002F15.file-upload",{"title":1278,"path":1279,"stem":1280},"Глобалізація та Локалізація MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fglobalization-localization","01.csharp\u002F11.aspnet\u002F11.mvc\u002F16.globalization-localization",{"title":1282,"path":1283,"stem":1284},"Підсумковий проєкт: Блог-платформа","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmvc-project","01.csharp\u002F11.aspnet\u002F11.mvc\u002F17.mvc-project",{"title":1286,"path":1287,"stem":1288},"План курсу: ASP.NET Core MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fplan","01.csharp\u002F11.aspnet\u002F11.mvc\u002Fplan",{"title":1290,"path":1291,"stem":1292,"children":1293,"page":59},"Web Api","\u002Fcsharp\u002Faspnet\u002Fweb-api","01.csharp\u002F11.aspnet\u002F12.web-api",[1294,1298,1302,1306,1310,1314,1318,1322,1326,1330,1334,1338,1342],{"title":1295,"path":1296,"stem":1297},"Від Minimal API до Controller-based API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Ffrom-minimal-api-to-controllers","01.csharp\u002F11.aspnet\u002F12.web-api\u002F01.from-minimal-api-to-controllers",{"title":1299,"path":1300,"stem":1301},"ControllerBase, ActionResult\u003CT> та Response Types","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fcontroller-base-actionresult","01.csharp\u002F11.aspnet\u002F12.web-api\u002F02.controller-base-actionresult",{"title":1303,"path":1304,"stem":1305},"Content Negotiation - JSON, XML та власні форматери","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fcontent-negotiation","01.csharp\u002F11.aspnet\u002F12.web-api\u002F03.content-negotiation",{"title":1307,"path":1308,"stem":1309},"Версіонування API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fapi-versioning","01.csharp\u002F11.aspnet\u002F12.web-api\u002F04.api-versioning",{"title":1311,"path":1312,"stem":1313},"ProblemDetails та структурована обробка помилок","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fproblemdetails-error-handling","01.csharp\u002F11.aspnet\u002F12.web-api\u002F05.problemdetails-error-handling",{"title":1315,"path":1316,"stem":1317},"Фільтри у Web API контексті","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Ffilters-for-api","01.csharp\u002F11.aspnet\u002F12.web-api\u002F06.filters-for-api",{"title":1319,"path":1320,"stem":1321},"Пагінація, фільтрація та сортування","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fpagination-filtering-sorting","01.csharp\u002F11.aspnet\u002F12.web-api\u002F07.pagination-filtering-sorting",{"title":1323,"path":1324,"stem":1325},"HATEOAS та Resource Expansion","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fhateoas-resource-expansion","01.csharp\u002F11.aspnet\u002F12.web-api\u002F08.hateoas-resource-expansion",{"title":1327,"path":1328,"stem":1329},"Гібридна архітектура - Minimal API + Controllers","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fminimal-api-vs-controllers-hybrid","01.csharp\u002F11.aspnet\u002F12.web-api\u002F09.minimal-api-vs-controllers-hybrid",{"title":1331,"path":1332,"stem":1333},"Документація API - Swashbuckle, NSwag та генерація клієнтів","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fapi-documentation-generation","01.csharp\u002F11.aspnet\u002F12.web-api\u002F10.api-documentation-generation",{"title":1335,"path":1336,"stem":1337},"Health Checks та моніторинг API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fhealth-checks-monitoring","01.csharp\u002F11.aspnet\u002F12.web-api\u002F11.health-checks-monitoring",{"title":1339,"path":1340,"stem":1341},"Підсумковий проєкт - Production-Ready REST API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fweb-api-project","01.csharp\u002F11.aspnet\u002F12.web-api\u002F12.web-api-project",{"title":1343,"path":1344,"stem":1345},"План курсу: ASP.NET Core Web API (Controllers)","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fplan","01.csharp\u002F11.aspnet\u002F12.web-api\u002Fplan",{"title":1347,"icon":1348,"path":1349,"stem":1350,"children":1351,"page":59},"Моніторинг","i-lucide-activity","\u002Fcsharp\u002Faspnet\u002Fmonitoring","01.csharp\u002F11.aspnet\u002F13.monitoring",[1352,1356,1360],{"title":1353,"path":1354,"stem":1355},"Спостережуваність: від console.log до production-систем","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fobservability-intro","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F01.observability-intro",{"title":1357,"path":1358,"stem":1359},"Health Checks: перший рівень observability","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fhealth-checks","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F02.health-checks",{"title":1361,"path":1362,"stem":1363},"Вбудовані метрики .NET 10 та System.Diagnostics.Metrics","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fdotnet-metrics","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F03.dotnet-metrics",{"title":1365,"icon":1366,"path":1367,"stem":1368,"children":1369,"page":59},"Desktop UI","i-lucide-app-window","\u002Fcsharp\u002Fdesktop-ui","01.csharp\u002F12.desktop-ui",[1370,1374,1378,1382,1386,1390,1394,1398,1402,1406,1410,1414,1418,1422,1426,1430,1434,1438,1442,1446,1450,1454,1458,1462,1466,1470,1474,1478,1482,1486,1490,1494,1498,1502,1506,1510,1514,1518,1522,1526,1530,1534,1538,1542,1546,1550,1554,1558,1562,1566,1570,1574,1578,1582,1586,1590,1594,1598,1602,1606,1610,1614,1618,1622,1626,1630,1634,1638,1642,1646,1650],{"title":1371,"path":1372,"stem":1373},"Що таке десктопна розробка?","\u002Fcsharp\u002Fdesktop-ui\u002Fwhat-is-desktop-dev","01.csharp\u002F12.desktop-ui\u002F01.what-is-desktop-dev",{"title":1375,"path":1376,"stem":1377},"Архітектура WPF — як влаштований графічний інтерфейс","\u002Fcsharp\u002Fdesktop-ui\u002Fwpf-architecture","01.csharp\u002F12.desktop-ui\u002F02.wpf-architecture",{"title":1379,"path":1380,"stem":1381},"Перший WPF-проєкт — від нуля до вікна","\u002Fcsharp\u002Fdesktop-ui\u002Ffirst-wpf-app","01.csharp\u002F12.desktop-ui\u002F03.first-wpf-app",{"title":1383,"path":1384,"stem":1385},"Перший Avalonia-проєкт: WPF для всіх платформ","\u002Fcsharp\u002Fdesktop-ui\u002F03a.first-avalonia-app","01.csharp\u002F12.desktop-ui\u002F03a.first-avalonia-app",{"title":1387,"path":1388,"stem":1389},"XAML: декларативний інтерфейс","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-basics","01.csharp\u002F12.desktop-ui\u002F04.xaml-basics",{"title":1391,"path":1392,"stem":1393},"Fluent UI у WPF — сучасний дизайн Windows 11","\u002Fcsharp\u002Fdesktop-ui\u002F04a.wpf-fluent-ui","01.csharp\u002F12.desktop-ui\u002F04a.wpf-fluent-ui",{"title":1395,"path":1396,"stem":1397},"WPF UI — сучасна бібліотека Fluent контролів","\u002Fcsharp\u002Fdesktop-ui\u002F04b.wpf-ui-library","01.csharp\u002F12.desktop-ui\u002F04b.wpf-ui-library",{"title":1399,"path":1400,"stem":1401},"HandyControl — велика бібліотека UI контролів для WPF","\u002Fcsharp\u002Fdesktop-ui\u002F04c.handycontrol-library","01.csharp\u002F12.desktop-ui\u002F04c.handycontrol-library",{"title":1403,"path":1404,"stem":1405},"Простори імен та ресурси XAML","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-namespaces-resources","01.csharp\u002F12.desktop-ui\u002F05.xaml-namespaces-resources",{"title":1407,"path":1408,"stem":1409},"XAML в Avalonia: ключові відмінності від WPF","\u002Fcsharp\u002Fdesktop-ui\u002F05a.avalonia-xaml-differences","01.csharp\u002F12.desktop-ui\u002F05a.avalonia-xaml-differences",{"title":1411,"path":1412,"stem":1413},"Розширення розмітки XAML (Markup Extensions)","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-markup-extensions","01.csharp\u002F12.desktop-ui\u002F06.xaml-markup-extensions",{"title":1415,"path":1416,"stem":1417},"Панелі Layout: StackPanel, WrapPanel, DockPanel","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-panels-part1","01.csharp\u002F12.desktop-ui\u002F07.layout-panels-part1",{"title":1419,"path":1420,"stem":1421},"Grid, Canvas, UniformGrid","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-panels-part2","01.csharp\u002F12.desktop-ui\u002F07.layout-panels-part2",{"title":1423,"path":1424,"stem":1425},"Просунуті техніки Layout","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-advanced","01.csharp\u002F12.desktop-ui\u002F08.layout-advanced",{"title":1427,"path":1428,"stem":1429},"Адаптивний Layout та найкращі практики","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-responsive","01.csharp\u002F12.desktop-ui\u002F09.layout-responsive",{"title":1431,"path":1432,"stem":1433},"Layout в Avalonia: відмінності та нові можливості","\u002Fcsharp\u002Fdesktop-ui\u002F09a.layout-avalonia","01.csharp\u002F12.desktop-ui\u002F09a.layout-avalonia",{"title":1435,"path":1436,"stem":1437},"Button, Image, ProgressBar та інші базові контроли","\u002Fcsharp\u002Fdesktop-ui\u002Fbasic-controls","01.csharp\u002F12.desktop-ui\u002F10.basic-controls",{"title":1439,"path":1440,"stem":1441},"Контроли в Avalonia: відмінності від WPF","\u002Fcsharp\u002Fdesktop-ui\u002F10a.controls-avalonia","01.csharp\u002F12.desktop-ui\u002F10a.controls-avalonia",{"title":1443,"path":1444,"stem":1445},"Текстові контроли — TextBlock, TextBox, RichTextBox","\u002Fcsharp\u002Fdesktop-ui\u002Ftext-controls","01.csharp\u002F12.desktop-ui\u002F11.text-controls",{"title":1447,"path":1448,"stem":1449},"Контроли вибору — CheckBox, RadioButton, ComboBox, ListBox, DatePicker","\u002Fcsharp\u002Fdesktop-ui\u002Fselection-controls","01.csharp\u002F12.desktop-ui\u002F12.selection-controls",{"title":1451,"path":1452,"stem":1453},"Content Model — GroupBox, Expander, TabControl, StatusBar","\u002Fcsharp\u002Fdesktop-ui\u002Fcontent-controls","01.csharp\u002F12.desktop-ui\u002F13.content-controls",{"title":1455,"path":1456,"stem":1457},"UI\u002FUX принципи десктопних застосунків","\u002Fcsharp\u002Fdesktop-ui\u002F13a.ui-ux-principles","01.csharp\u002F12.desktop-ui\u002F13a.ui-ux-principles",{"title":1459,"path":1460,"stem":1461},"Dependency Properties — Концепція та Value Resolution","\u002Fcsharp\u002Fdesktop-ui\u002Fdependency-properties-part1","01.csharp\u002F12.desktop-ui\u002F14.dependency-properties-part1",{"title":1463,"path":1464,"stem":1465},"Avalonia Property System — StyledProperty та DirectProperty","\u002Fcsharp\u002Fdesktop-ui\u002F14a.avalonia-property-system","01.csharp\u002F12.desktop-ui\u002F14a.avalonia-property-system",{"title":1467,"path":1468,"stem":1469},"Attached Properties — Властивості без меж","\u002Fcsharp\u002Fdesktop-ui\u002Fattached-properties","01.csharp\u002F12.desktop-ui\u002F15.attached-properties",{"title":1471,"path":1472,"stem":1473},"Routed Events — Маршрутизація подій у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Frouted-events","01.csharp\u002F12.desktop-ui\u002F16.routed-events",{"title":1475,"path":1476,"stem":1477},"Data Binding — Від Code-Behind до Декларативності","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-basics-part1","01.csharp\u002F12.desktop-ui\u002F17.data-binding-basics-part1",{"title":1479,"path":1480,"stem":1481},"INotifyPropertyChanged — Живе оновлення UI","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-basics-part2","01.csharp\u002F12.desktop-ui\u002F17.data-binding-basics-part2",{"title":1483,"path":1484,"stem":1485},"Compiled Bindings в Avalonia — Безпека на етапі компіляції","\u002Fcsharp\u002Fdesktop-ui\u002F17a.avalonia-compiled-bindings","01.csharp\u002F12.desktop-ui\u002F17a.avalonia-compiled-bindings",{"title":1487,"path":1488,"stem":1489},"Просунутий Data Binding — ElementName, RelativeSource, MultiBinding","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-advanced","01.csharp\u002F12.desktop-ui\u002F18.data-binding-advanced",{"title":1491,"path":1492,"stem":1493},"Value Converters — Перетворення типів даних у Data Binding","\u002Fcsharp\u002Fdesktop-ui\u002Fvalue-converters","01.csharp\u002F12.desktop-ui\u002F19.value-converters",{"title":1495,"path":1496,"stem":1497},"Data Templates — Візуалізація об'єктів у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-templates","01.csharp\u002F12.desktop-ui\u002F20.data-templates",{"title":1499,"path":1500,"stem":1501},"Collections Binding Part 1 — ObservableCollection та ItemsControl","\u002Fcsharp\u002Fdesktop-ui\u002Fcollections-binding-part1","01.csharp\u002F12.desktop-ui\u002F21.collections-binding-part1",{"title":1503,"path":1504,"stem":1505},"Collections Binding Part 2 — ICollectionView, Filtering, Sorting та Virtualization","\u002Fcsharp\u002Fdesktop-ui\u002Fcollections-binding-part2","01.csharp\u002F12.desktop-ui\u002F21.collections-binding-part2",{"title":1507,"path":1508,"stem":1509},"MVVM Pattern — Від Spaghetti Code до архітектури","\u002Fcsharp\u002Fdesktop-ui\u002Fmvvm-pattern","01.csharp\u002F12.desktop-ui\u002F22.mvvm-pattern",{"title":1511,"path":1512,"stem":1513},"ViewModel Implementation — Від BaseViewModel до валідації","\u002Fcsharp\u002Fdesktop-ui\u002Fviewmodel-implementation","01.csharp\u002F12.desktop-ui\u002F23.viewmodel-implementation",{"title":1515,"path":1516,"stem":1517},"Commands — Від event handlers до декларативних команд","\u002Fcsharp\u002Fdesktop-ui\u002Fcommands","01.csharp\u002F12.desktop-ui\u002F24.commands",{"title":1519,"path":1520,"stem":1521},"MVVM Toolkit — MVVM без boilerplate через Source Generators","\u002Fcsharp\u002Fdesktop-ui\u002Fmvvm-toolkit","01.csharp\u002F12.desktop-ui\u002F25.mvvm-toolkit",{"title":1523,"path":1524,"stem":1525},"Messenger Pattern — Комунікація між ViewModel без прямих посилань","\u002Fcsharp\u002Fdesktop-ui\u002Fmessenger-pattern","01.csharp\u002F12.desktop-ui\u002F26.messenger-pattern",{"title":1527,"path":1528,"stem":1529},"Стилі WPF — CSS для десктопу","\u002Fcsharp\u002Fdesktop-ui\u002Fstyles-basics","01.csharp\u002F12.desktop-ui\u002F27.styles-basics",{"title":1531,"path":1532,"stem":1533},"CSS-like стилі Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002F27a.avalonia-css-styling","01.csharp\u002F12.desktop-ui\u002F27a.avalonia-css-styling",{"title":1535,"path":1536,"stem":1537},"Control Templates — Частина 1. Концепція та TemplateBinding","\u002Fcsharp\u002Fdesktop-ui\u002Fcontrol-templates-part1","01.csharp\u002F12.desktop-ui\u002F28.control-templates-part1",{"title":1539,"path":1540,"stem":1541},"Control Templates — Частина 2. Named Parts та ContentPresenter","\u002Fcsharp\u002Fdesktop-ui\u002Fcontrol-templates-part2","01.csharp\u002F12.desktop-ui\u002F28.control-templates-part2",{"title":1543,"path":1544,"stem":1545},"Control Themes в Avalonia — нова ера стилізації","\u002Fcsharp\u002Fdesktop-ui\u002F28a.avalonia-control-themes","01.csharp\u002F12.desktop-ui\u002F28a.avalonia-control-themes",{"title":1547,"path":1548,"stem":1549},"Triggers та Visual State Manager у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Ftriggers-visual-states","01.csharp\u002F12.desktop-ui\u002F29.triggers-visual-states",{"title":1551,"path":1552,"stem":1553},"Pseudo-classes в Avalonia — замість WPF Triggers","\u002Fcsharp\u002Fdesktop-ui\u002F29a.avalonia-pseudo-classes","01.csharp\u002F12.desktop-ui\u002F29a.avalonia-pseudo-classes",{"title":1555,"path":1556,"stem":1557},"Теми та ресурсні словники у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fresources-themes","01.csharp\u002F12.desktop-ui\u002F30.resources-themes",{"title":1559,"path":1560,"stem":1561},"Avalonia Themes — Fluent Design та система тематизації","\u002Fcsharp\u002Fdesktop-ui\u002F30a.avalonia-themes-fluent","01.csharp\u002F12.desktop-ui\u002F30a.avalonia-themes-fluent",{"title":1563,"path":1564,"stem":1565},"Контроли колекцій — глибоке занурення","\u002Fcsharp\u002Fdesktop-ui\u002Fcollection-controls","01.csharp\u002F12.desktop-ui\u002F31.collection-controls",{"title":1567,"path":1568,"stem":1569},"DataGrid — колонки та базове відображення","\u002Fcsharp\u002Fdesktop-ui\u002Fdatagrid-part1","01.csharp\u002F12.desktop-ui\u002F32.datagrid-part1",{"title":1571,"path":1572,"stem":1573},"DataGrid — сортування, фільтрація, редагування","\u002Fcsharp\u002Fdesktop-ui\u002Fdatagrid-part2","01.csharp\u002F12.desktop-ui\u002F32.datagrid-part2",{"title":1575,"path":1576,"stem":1577},"TreeView та GridView","\u002Fcsharp\u002Fdesktop-ui\u002Ftreeview-listview","01.csharp\u002F12.desktop-ui\u002F33.treeview-listview",{"title":1579,"path":1580,"stem":1581},"Меню, Toolbar, ContextMenu, StatusBar","\u002Fcsharp\u002Fdesktop-ui\u002Fmenus-toolbars","01.csharp\u002F12.desktop-ui\u002F34.menus-toolbars",{"title":1583,"path":1584,"stem":1585},"Навігація та керування вікнами. Частина 1: вікна та сторінки","\u002Fcsharp\u002Fdesktop-ui\u002Fnavigation-windows-part1","01.csharp\u002F12.desktop-ui\u002F35.navigation-windows-part1",{"title":1587,"path":1588,"stem":1589},"Навігація та керування вікнами. Частина 2: MVVM-навігація","\u002Fcsharp\u002Fdesktop-ui\u002Fnavigation-windows-part2","01.csharp\u002F12.desktop-ui\u002F35.navigation-windows-part2",{"title":1591,"path":1592,"stem":1593},"Avalonia — Навігація та діалоги","\u002Fcsharp\u002Fdesktop-ui\u002F35a.avalonia-navigation-dialogs","01.csharp\u002F12.desktop-ui\u002F35a.avalonia-navigation-dialogs",{"title":1595,"path":1596,"stem":1597},"Діалоги та File Pickers у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fdialogs-file-pickers","01.csharp\u002F12.desktop-ui\u002F36.dialogs-file-pickers",{"title":1599,"path":1600,"stem":1601},"UserControl: компонентний підхід у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fuser-controls","01.csharp\u002F12.desktop-ui\u002F37.user-controls",{"title":1603,"path":1604,"stem":1605},"Custom Controls: Lookless Controls у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fcustom-controls","01.csharp\u002F12.desktop-ui\u002F38.custom-controls",{"title":1607,"path":1608,"stem":1609},"Avalonia TemplatedControl — Lookless Controls","\u002Fcsharp\u002Fdesktop-ui\u002F38a.avalonia-templated-controls","01.csharp\u002F12.desktop-ui\u002F38a.avalonia-templated-controls",{"title":1611,"path":1612,"stem":1613},"Анімації у WPF: Storyboard та Easing Functions","\u002Fcsharp\u002Fdesktop-ui\u002Fanimations-transitions","01.csharp\u002F12.desktop-ui\u002F39.animations-transitions",{"title":1615,"path":1616,"stem":1617},"Анімації в Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002F39a.avalonia-animations","01.csharp\u002F12.desktop-ui\u002F39a.avalonia-animations",{"title":1619,"path":1620,"stem":1621},"2D Графіка та Мультимедіа у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fmedia-graphics","01.csharp\u002F12.desktop-ui\u002F40.media-graphics",{"title":1623,"path":1624,"stem":1625},"Dependency Injection у WPF та Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002Fdi-integration","01.csharp\u002F12.desktop-ui\u002F41.di-integration",{"title":1627,"path":1628,"stem":1629},"SQLite та EF Core у десктопних додатках","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-persistence-part1","01.csharp\u002F12.desktop-ui\u002F42.data-persistence-part1",{"title":1631,"path":1632,"stem":1633},"Repository Pattern та Unit of Work","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-persistence-part2","01.csharp\u002F12.desktop-ui\u002F43.data-persistence-part2",{"title":1635,"path":1636,"stem":1637},"Тестування ViewModels","\u002Fcsharp\u002Fdesktop-ui\u002Fviewmodel-testing","01.csharp\u002F12.desktop-ui\u002F44.viewmodel-testing",{"title":1639,"path":1640,"stem":1641},"Avalonia Headless Testing — тестування UI без вікон","\u002Fcsharp\u002Fdesktop-ui\u002F44a.avalonia-headless-testing","01.csharp\u002F12.desktop-ui\u002F44a.avalonia-headless-testing",{"title":1643,"path":1644,"stem":1645},"Кросплатформна розробка з Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002Favalonia-cross-platform","01.csharp\u002F12.desktop-ui\u002F45.avalonia-cross-platform",{"title":1647,"path":1648,"stem":1649},"Пакування та розгортання Avalonia додатків","\u002Fcsharp\u002Fdesktop-ui\u002Favalonia-packaging-deployment","01.csharp\u002F12.desktop-ui\u002F46.avalonia-packaging-deployment",{"title":1651,"path":1652,"stem":1653},"Розгортання WPF застосунків","\u002Fcsharp\u002Fdesktop-ui\u002Fwpf-packaging-deployment","01.csharp\u002F12.desktop-ui\u002F47.wpf-packaging-deployment",{"title":1655,"icon":658,"path":1656,"stem":1657,"children":1658,"page":59},"Network Programming","\u002Fcsharp\u002Fnetwork-programming","01.csharp\u002F13.network-programming",[1659,1663,1667,1671,1675,1679,1683,1687,1691,1695,1699],{"title":1660,"path":1661,"stem":1662},"Основи комп'ютерних мереж","\u002Fcsharp\u002Fnetwork-programming\u002Ffoundations","01.csharp\u002F13.network-programming\u002F01.foundations",{"title":1664,"path":1665,"stem":1666},"Модель OSI та стек TCP\u002FIP","\u002Fcsharp\u002Fnetwork-programming\u002Fosi-model","01.csharp\u002F13.network-programming\u002F02.osi-model",{"title":1668,"path":1669,"stem":1670},"IP-протокол та адресація","\u002Fcsharp\u002Fnetwork-programming\u002Fip-addressing","01.csharp\u002F13.network-programming\u002F03.ip-addressing",{"title":1672,"path":1673,"stem":1674},"UDP — протокол без з'єднання","\u002Fcsharp\u002Fnetwork-programming\u002Fudp","01.csharp\u002F13.network-programming\u002F05.udp",{"title":1676,"path":1677,"stem":1678},"UDP Broadcast та Multicast","\u002Fcsharp\u002Fnetwork-programming\u002Fudp-broadcast-multicast","01.csharp\u002F13.network-programming\u002F06.udp-broadcast-multicast",{"title":1680,"path":1681,"stem":1682},"HTTP — протокол вебу","\u002Fcsharp\u002Fnetwork-programming\u002Fhttp-fundamentals","01.csharp\u002F13.network-programming\u002F07.http-fundamentals",{"title":1684,"path":1685,"stem":1686},"HttpListener — вбудований HTTP-сервер .NET","\u002Fcsharp\u002Fnetwork-programming\u002F07a.http-listener","01.csharp\u002F13.network-programming\u002F07a.http-listener",{"title":1688,"path":1689,"stem":1690},"HTTP Advanced — cookies, аутентифікація та HTTPS","\u002Fcsharp\u002Fnetwork-programming\u002Fhttp-advanced","01.csharp\u002F13.network-programming\u002F08.http-advanced",{"title":1692,"path":1693,"stem":1694},"SMTP та протоколи електронної пошти","\u002Fcsharp\u002Fnetwork-programming\u002Fsmtp","01.csharp\u002F13.network-programming\u002F09.smtp",{"title":1696,"path":1697,"stem":1698},"WebSocket — повнодуплексний протокол реального часу","\u002Fcsharp\u002Fnetwork-programming\u002Fwebsockets","01.csharp\u002F13.network-programming\u002F10.websockets",{"title":1700,"path":1701,"stem":1702},"TLS\u002FSSL — криптографічний захист мережевих з'єднань","\u002Fcsharp\u002Fnetwork-programming\u002Ftls-ssl","01.csharp\u002F13.network-programming\u002F11.tls-ssl",{"title":1704,"path":1705,"stem":1706},"C# & .NET: The Ultimate Roadmap","\u002Fcsharp\u002Froadmap","01.csharp\u002Froadmap",{"title":1708,"icon":1709,"path":1710,"stem":1711,"children":1712,"page":59},"C++","i-devicon-cplusplus","\u002Fcpp","02.cpp",[1713,1717,1721,1725,1729,1733,1737,1741,1745,1748,1752,1756,1760,1764,1768,1772,1776,1780,1784,1788,1792,1796,1800,1804,1808,1812,1816,1820,1824,1828,1832,1836,1840,1844,1848,1852,1856,1860,1864,1868,1872,1876,1880,1884,1888,1892,1896,1900,1904,1908,1912,1916,1920,1924,1928,1932,1936,1940,1944,1948,1952,1956,1960,1964,1968,1972,1976,1980,1984,1988,1992,1996,2000,2004,2008,2012,2016,2020,2024,2028,2032,2036,2040,2044,2048,2052,2056,2060,2064,2068,2072,2076,2080,2084,2088,2092,2096],{"title":1714,"path":1715,"stem":1716},"Вступ у програмування та алгоритми","\u002Fcpp\u002Fintro-algorithms","02.cpp\u002F01.intro-algorithms",{"title":1718,"path":1719,"stem":1720},"Code Style: угоди про оформлення коду","\u002Fcpp\u002Fcode-style","02.cpp\u002F02.code-style",{"title":1722,"path":1723,"stem":1724},"Середовище розробки та перший проєкт","\u002Fcpp\u002Fide-setup","02.cpp\u002F03.ide-setup",{"title":1726,"path":1727,"stem":1728},"Вивід даних на екран","\u002Fcpp\u002Fdata-output","02.cpp\u002F04.data-output",{"title":1730,"path":1731,"stem":1732},"Типи даних, змінні та константи","\u002Fcpp\u002Fdata-types-variables","02.cpp\u002F05.data-types-variables",{"title":1734,"path":1735,"stem":1736},"Ввід даних з клавіатури","\u002Fcpp\u002Fdata-input","02.cpp\u002F06.data-input",{"title":1738,"path":1739,"stem":1740},"Оператори, перетворення типів та логічні операції","\u002Fcpp\u002Foperators-type-conversion","02.cpp\u002F07.operators-type-conversion",{"title":1742,"path":1743,"stem":1744},"Цикли","\u002Fcpp\u002Floops","02.cpp\u002F08.loops",{"title":32,"path":1746,"stem":1747},"\u002Fcpp\u002Farrays","02.cpp\u002F09.arrays",{"title":1749,"path":1750,"stem":1751},"Алгоритми сортування та аналіз складності","\u002Fcpp\u002Fsorting","02.cpp\u002F10.sorting",{"title":1753,"path":1754,"stem":1755},"Алгоритми пошуку","\u002Fcpp\u002Fsearching","02.cpp\u002F11.searching",{"title":1757,"path":1758,"stem":1759},"Функції: основи","\u002Fcpp\u002Ffunctions-basics","02.cpp\u002F12.functions-basics",{"title":1761,"path":1762,"stem":1763},"Функції: прототипи, область видимості та додаткові можливості","\u002Fcpp\u002Ffunctions-scope","02.cpp\u002F13.functions-scope",{"title":1765,"path":1766,"stem":1767},"Функції: перевантаження та шаблони","\u002Fcpp\u002Ffunctions-overloading-templates","02.cpp\u002F14.functions-overloading-templates",{"title":1769,"path":1770,"stem":1771},"Вказівники: основи","\u002Fcpp\u002Fpointers-basics","02.cpp\u002F15.pointers-basics",{"title":1773,"path":1774,"stem":1775},"Посилання (References)","\u002Fcpp\u002Freferences","02.cpp\u002F16.references",{"title":1777,"path":1778,"stem":1779},"Вказівники, const і масиви","\u002Fcpp\u002Fpointers-const-arrays","02.cpp\u002F17.pointers-const-arrays",{"title":1781,"path":1782,"stem":1783},"Адресна арифметика","\u002Fcpp\u002Fpointer-arithmetic","02.cpp\u002F18.pointer-arithmetic",{"title":1785,"path":1786,"stem":1787},"Динамічна пам'ять","\u002Fcpp\u002Fdynamic-memory","02.cpp\u002F19.dynamic-memory",{"title":1789,"path":1790,"stem":1791},"Вказівники типу void","\u002Fcpp\u002Fvoid-pointers","02.cpp\u002F20.void-pointers",{"title":1793,"path":1794,"stem":1795},"Вказівники на вказівники","\u002Fcpp\u002Fpointers-to-pointers","02.cpp\u002F21.pointers-to-pointers",{"title":1797,"path":1798,"stem":1799},"Оператор доступу до членів через вказівник (->)","\u002Fcpp\u002Fmember-access-operator","02.cpp\u002F22.member-access-operator",{"title":1801,"path":1802,"stem":1803},"Цикл for-each (Range-based for)","\u002Fcpp\u002Fforeach-loop","02.cpp\u002F23.foreach-loop",{"title":1805,"path":1806,"stem":1807},"Вказівники на функції","\u002Fcpp\u002Ffunction-pointers","02.cpp\u002F24.function-pointers",{"title":1809,"path":1810,"stem":1811},"Лямбда-вирази","\u002Fcpp\u002Flambdas","02.cpp\u002F25.lambdas",{"title":1813,"path":1814,"stem":1815},"Лямбда-захоплення","\u002Fcpp\u002Flambda-captures","02.cpp\u002F26.lambda-captures",{"title":1817,"path":1818,"stem":1819},"Еліпсис","\u002Fcpp\u002Fellipsis","02.cpp\u002F27.ellipsis",{"title":1821,"path":1822,"stem":1823},"Безпечні альтернативи еліпсису","\u002Fcpp\u002F27a.ellipsis","02.cpp\u002F27a.ellipsis",{"title":1825,"path":1826,"stem":1827},"Аргументи командного рядка","\u002Fcpp\u002Fcommand-line-arguments","02.cpp\u002F28.command-line-arguments",{"title":1829,"path":1830,"stem":1831},"Перерахування (enum)","\u002Fcpp\u002Fenum","02.cpp\u002F29.enum",{"title":1833,"path":1834,"stem":1835},"Класи-перерахування (enum class)","\u002Fcpp\u002Fenum-class","02.cpp\u002F30.enum-class",{"title":1837,"path":1838,"stem":1839},"Псевдоніми типів (typedef і using)","\u002Fcpp\u002Ftype-aliases","02.cpp\u002F31.type-aliases",{"title":1841,"path":1842,"stem":1843},"Системи числення та двійкова арифметика","\u002Fcpp\u002Fnumber-systems","02.cpp\u002F32.number-systems",{"title":1845,"path":1846,"stem":1847},"Структури (struct): агрегування даних","\u002Fcpp\u002Fstruct","02.cpp\u002F33.struct",{"title":1849,"path":1850,"stem":1851},"Структури у функціях","\u002Fcpp\u002Fstruct-functions","02.cpp\u002F34.struct-functions",{"title":1853,"path":1854,"stem":1855},"Масиви структур і вкладені структури","\u002Fcpp\u002Fstruct-arrays","02.cpp\u002F35.struct-arrays",{"title":1857,"path":1858,"stem":1859},"Патерни struct та межі застосування","\u002Fcpp\u002Fstruct-patterns","02.cpp\u002F36.struct-patterns",{"title":1861,"path":1862,"stem":1863},"Символи та таблиця ASCII","\u002Fcpp\u002Fascii-characters","02.cpp\u002F37.ascii-characters",{"title":1865,"path":1866,"stem":1867},"Unicode та кодування UTF","\u002Fcpp\u002Funicode-utf","02.cpp\u002F38.unicode-utf",{"title":1869,"path":1870,"stem":1871},"C-style рядки","\u002Fcpp\u002Fc-strings","02.cpp\u002F39.c-strings",{"title":1873,"path":1874,"stem":1875},"Вступ до std::string","\u002Fcpp\u002Fstd-string-intro","02.cpp\u002F40.std-string-intro",{"title":1877,"path":1878,"stem":1879},"Довжина, ємність та доступ до символів std::string","\u002Fcpp\u002Fstd-string-capacity-access","02.cpp\u002F41.std-string-capacity-access",{"title":1881,"path":1882,"stem":1883},"Модифікація std::string: присвоювання, додавання, вставка, видалення та заміна","\u002Fcpp\u002Fstd-string-modification","02.cpp\u002F42.std-string-modification",{"title":1885,"path":1886,"stem":1887},"Пошук у std::string: find, npos та практичні патерни","\u002Fcpp\u002Fstd-string-search","02.cpp\u002F43.std-string-search",{"title":1889,"path":1890,"stem":1891},"std::string_view: невласницький погляд на рядок без копіювання","\u002Fcpp\u002Fstd-string-view","02.cpp\u002F44.std-string-view",{"title":1893,"path":1894,"stem":1895},"Об'єднання (union): один блок пам'яті, кілька інтерпретацій","\u002Fcpp\u002Funion","02.cpp\u002F45.union",{"title":1897,"path":1898,"stem":1899},"Організація коду: файли, препроцесор, простори імен","\u002Fcpp\u002Fmultifile-programs","02.cpp\u002F46.multifile-programs",{"title":1901,"path":1902,"stem":1903},"Робота з файлами: C-стиль (stdio.h)","\u002Fcpp\u002Fc-style-files","02.cpp\u002F47.c-style-files",{"title":1905,"path":1906,"stem":1907},"Робота з файлами: C++-стиль (fstream)","\u002Fcpp\u002Fcpp-style-files","02.cpp\u002F48.cpp-style-files",{"title":1909,"path":1910,"stem":1911},"Введення в ООП: від процедур до об'єктів","\u002Fcpp\u002Foop-intro","02.cpp\u002F49.oop-intro",{"title":1913,"path":1914,"stem":1915},"Класи, об'єкти та методи","\u002Fcpp\u002Fclasses-objects-methods","02.cpp\u002F50.classes-objects-methods",{"title":1917,"path":1918,"stem":1919},"Специфікатори доступу та інкапсуляція","\u002Fcpp\u002Faccess-specifiers-encapsulation","02.cpp\u002F51.access-specifiers-encapsulation",{"title":1921,"path":1922,"stem":1923},"Конструктори: гарантована ініціалізація об'єктів","\u002Fcpp\u002Fconstructors","02.cpp\u002F52.constructors",{"title":1925,"path":1926,"stem":1927},"Списки ініціалізації та делегуючі конструктори","\u002Fcpp\u002Finit-lists-delegating","02.cpp\u002F53.init-lists-delegating",{"title":1929,"path":1930,"stem":1931},"Деструктори та ідіома RAII","\u002Fcpp\u002Fdestructors-raii","02.cpp\u002F54.destructors-raii",{"title":1933,"path":1934,"stem":1935},"Прихований покажчик this","\u002Fcpp\u002Fthis-pointer","02.cpp\u002F55.this-pointer",{"title":1937,"path":1938,"stem":1939},"Розподіл класу на заголовковий файл та файл реалізації","\u002Fcpp\u002Fclass-header-source","02.cpp\u002F56.class-header-source",{"title":1941,"path":1942,"stem":1943},"Класи та const","\u002Fcpp\u002Fconst-classes","02.cpp\u002F57.const-classes",{"title":1945,"path":1946,"stem":1947},"Статичні члени класу","\u002Fcpp\u002Fstatic-members","02.cpp\u002F58.static-members",{"title":1949,"path":1950,"stem":1951},"Конструктор копіювання та запобігання копіюванню","\u002Fcpp\u002Fcopy-constructor","02.cpp\u002F59.copy-constructor",{"title":1953,"path":1954,"stem":1955},"Дружні функції та класи","\u002Fcpp\u002Ffriend-functions-classes","02.cpp\u002F60.friend-functions-classes",{"title":1957,"path":1958,"stem":1959},"Анонімні об'єкти та вкладені типи","\u002Fcpp\u002Fanonymous-objects-nested-types","02.cpp\u002F61.anonymous-objects-nested-types",{"title":1961,"path":1962,"stem":1963},"Вимірювання часу виконання: RAII-таймер","\u002Fcpp\u002Ftiming-raii-timer","02.cpp\u002F62.timing-raii-timer",{"title":1965,"path":1966,"stem":1967},"Перевантаження операторів: основи та арифметика","\u002Fcpp\u002Foperator-overloading-basics","02.cpp\u002F63.operator-overloading-basics",{"title":1969,"path":1970,"stem":1971},"Перевантаження операторів: методи класу та спеціальні оператори","\u002Fcpp\u002Foperator-overloading-methods","02.cpp\u002F64.operator-overloading-methods",{"title":1973,"path":1974,"stem":1975},"Приведення типів, explicit та delete","\u002Fcpp\u002Ftypecast-explicit-delete","02.cpp\u002F65.typecast-explicit-delete",{"title":1977,"path":1978,"stem":1979},"Глибоке копіювання та оператор присвоювання","\u002Fcpp\u002Fdeep-copy-assignment","02.cpp\u002F66.deep-copy-assignment",{"title":1981,"path":1982,"stem":1983},"Зв'язки між об'єктами: композиція та агрегація","\u002Fcpp\u002Fcomposition-aggregation","02.cpp\u002F67.composition-aggregation",{"title":1985,"path":1986,"stem":1987},"Асоціація та залежність між об","\u002Fcpp\u002Fassociation-dependency","02.cpp\u002F68.association-dependency",{"title":1989,"path":1990,"stem":1991},"Контейнерні класи та `std::initializer_list`","\u002Fcpp\u002Fcontainer-classes-initializer-list","02.cpp\u002F69.container-classes-initializer-list",{"title":1993,"path":1994,"stem":1995},"Вступ до наслідування: базові поняття та відношення «is-a»","\u002Fcpp\u002Finheritance-intro","02.cpp\u002F70.inheritance-intro",{"title":1997,"path":1998,"stem":1999},"Конструктори, деструктори та порядок ініціалізації в ієрархіях","\u002Fcpp\u002Finheritance-constructors-destructors","02.cpp\u002F71.inheritance-constructors-destructors",{"title":2001,"path":2002,"stem":2003},"Специфікатор `protected` та види наслідування","\u002Fcpp\u002Finheritance-access-specifiers","02.cpp\u002F72.inheritance-access-specifiers",{"title":2005,"path":2006,"stem":2007},"Перевизначення методів та приховування імен","\u002Fcpp\u002Fmethod-overriding-hiding","02.cpp\u002F73.method-overriding-hiding",{"title":2009,"path":2010,"stem":2011},"Множинне наслідування та проблема ромба","\u002Fcpp\u002Fmultiple-inheritance-diamond","02.cpp\u002F74.multiple-inheritance-diamond",{"title":2013,"path":2014,"stem":2015},"Вказівники на базовий клас та віртуальні функції","\u002Fcpp\u002Fvirtual-functions-polymorphism","02.cpp\u002F75.virtual-functions-polymorphism",{"title":2017,"path":2018,"stem":2019},"Специфікатори override, final та віртуальні деструктори","\u002Fcpp\u002Foverride-final-virtual-destructors","02.cpp\u002F76.override-final-virtual-destructors",{"title":2021,"path":2022,"stem":2023},"Внутрішні механізми поліморфізму: vtable, vptr та зв'язування","\u002Fcpp\u002Fvirtual-table-binding","02.cpp\u002F77.virtual-table-binding",{"title":2025,"path":2026,"stem":2027},"Абстрактні класи та чисті віртуальні функції","\u002Fcpp\u002Fabstract-classes-interfaces","02.cpp\u002F78.abstract-classes-interfaces",{"title":2029,"path":2030,"stem":2031},"Зрізка об'єктів, віртуальне наслідування та поліморфний вивід","\u002Fcpp\u002Fslicing-virtual-base-io","02.cpp\u002F79.slicing-virtual-base-io",{"title":2033,"path":2034,"stem":2035},"Динамічне приведення типів (`dynamic_cast`) та RTTI","\u002Fcpp\u002Fdynamic-cast-rtti","02.cpp\u002F80.dynamic-cast-rtti",{"title":2037,"path":2038,"stem":2039},"Шаблони функцій: узагальнене програмування","\u002Fcpp\u002Ffunction-templates","02.cpp\u002F81.function-templates",{"title":2041,"path":2042,"stem":2043},"Шаблони класів та NTTP-параметри","\u002Fcpp\u002Fclass-templates-nttp","02.cpp\u002F82.class-templates-nttp",{"title":2045,"path":2046,"stem":2047},"Повна (явна) спеціалізація шаблонів","\u002Fcpp\u002Ffull-template-specialization","02.cpp\u002F83.full-template-specialization",{"title":2049,"path":2050,"stem":2051},"Часткова спеціалізація шаблонів класів","\u002Fcpp\u002Fpartial-template-specialization","02.cpp\u002F84.partial-template-specialization",{"title":2053,"path":2054,"stem":2055},"Механізм винятків: try, catch, throw та розкручування стеку","\u002Fcpp\u002Fexceptions-basics","02.cpp\u002F85.exceptions-basics",{"title":2057,"path":2058,"stem":2059},"Ієрархія std::exception та власні класи винятків","\u002Fcpp\u002Fexception-hierarchy-custom","02.cpp\u002F86.exception-hierarchy-custom",{"title":2061,"path":2062,"stem":2063},"Повторне генерування винятків та функціональний try-блок","\u002Fcpp\u002Frethrow-function-try","02.cpp\u002F87.rethrow-function-try",{"title":2065,"path":2066,"stem":2067},"Безпека винятків, noexcept та деструктори","\u002Fcpp\u002Fsafety-noexcept","02.cpp\u002F88.safety-noexcept",{"title":2069,"path":2070,"stem":2071},"Власні структури даних: стек та черга","\u002Fcpp\u002Fcustom-stack-queue","02.cpp\u002F89.custom-stack-queue",{"title":2073,"path":2074,"stem":2075},"Власні структури даних: однозв'язаний список","\u002Fcpp\u002Flinked-list","02.cpp\u002F90.linked-list",{"title":2077,"path":2078,"stem":2079},"Власні структури даних: бінарне дерево пошуку","\u002Fcpp\u002Fbinary-search-tree","02.cpp\u002F91.binary-search-tree",{"title":2081,"path":2082,"stem":2083},"Власні структури даних: хеш-таблиця","\u002Fcpp\u002Fhash-table","02.cpp\u002F92.hash-table",{"title":2085,"path":2086,"stem":2087},"Готові структури даних C++: послідовні контейнери STL","\u002Fcpp\u002Fstl-sequential-containers","02.cpp\u002F93.stl-sequential-containers",{"title":2089,"path":2090,"stem":2091},"Готові структури даних C++: асоціативні контейнери та адаптери","\u002Fcpp\u002Fstl-associative-adapters","02.cpp\u002F94.stl-associative-adapters",{"title":2093,"path":2094,"stem":2095},"Готові структури даних C++: ітератори та алгоритми STL","\u002Fcpp\u002Fstl-iterators-algorithms","02.cpp\u002F95.stl-iterators-algorithms",{"title":2097,"path":2098,"stem":2099},"R-value посилання та move-семантика","\u002Fcpp\u002Frvalue-references-move-semantics","02.cpp\u002F96.rvalue-references-move-semantics",{"title":2101,"icon":2102,"path":2103,"stem":2104,"children":2105,"page":59},"JavaScript","i-devicon-javascript","\u002Fjavascript","03.javascript",[2106,2132,2186,2208,2512,2550,2568],{"title":2107,"icon":2108,"path":2109,"stem":2110,"children":2111,"page":59},"Events","i-lucide-mouse-pointer-click","\u002Fjavascript\u002Fevents","03.javascript\u002F01.events",[2112,2116,2120,2124,2128],{"title":2113,"path":2114,"stem":2115},"Вступ до подій браузера","\u002Fjavascript\u002Fevents\u002Fintro","03.javascript\u002F01.events\u002F01.intro",{"title":2117,"path":2118,"stem":2119},"Бульбашковий механізм (Bubbling) та занурення (Capturing)","\u002Fjavascript\u002Fevents\u002Fbubbling-capturing","03.javascript\u002F01.events\u002F02.bubbling-capturing",{"title":2121,"path":2122,"stem":2123},"Делегування подій (Event Delegation)","\u002Fjavascript\u002Fevents\u002Fdelegate-events","03.javascript\u002F01.events\u002F03.delegate-events",{"title":2125,"path":2126,"stem":2127},"Типові дії браузера та preventDefault()","\u002Fjavascript\u002Fevents\u002Fprevent-default","03.javascript\u002F01.events\u002F04.prevent-default",{"title":2129,"path":2130,"stem":2131},"Запуск користувацьких подій (Custom Events)","\u002Fjavascript\u002Fevents\u002Fcustom-events","03.javascript\u002F01.events\u002F05.custom-events",{"title":2133,"icon":2134,"path":2135,"stem":2136,"children":2137,"page":59},"Network","i-lucide-globe","\u002Fjavascript\u002Fnetwork","03.javascript\u002F02.network",[2138,2142,2146,2150,2154,2158,2162,2166,2170,2174,2178,2182],{"title":2139,"path":2140,"stem":2141},"Fetch API - Сучасний підхід до HTTP-запитів","\u002Fjavascript\u002Fnetwork\u002F01-fetch-api","03.javascript\u002F02.network\u002F01-fetch-api",{"title":2143,"path":2144,"stem":2145},"FormData - Робота з формами та файлами","\u002Fjavascript\u002Fnetwork\u002F02-formdata","03.javascript\u002F02.network\u002F02-formdata",{"title":2147,"path":2148,"stem":2149},"Відстеження прогресу завантаження","\u002Fjavascript\u002Fnetwork\u002F03-download-progress","03.javascript\u002F02.network\u002F03-download-progress",{"title":2151,"path":2152,"stem":2153},"Переривання fetch-запитів","\u002Fjavascript\u002Fnetwork\u002F04-abort-requests","03.javascript\u002F02.network\u002F04-abort-requests",{"title":2155,"path":2156,"stem":2157},"CORS - Запити між різними джерелами","\u002Fjavascript\u002Fnetwork\u002F05-cors","03.javascript\u002F02.network\u002F05-cors",{"title":2159,"path":2160,"stem":2161},"Fetch API - Повний довідник опцій","\u002Fjavascript\u002Fnetwork\u002F06-fetch-options","03.javascript\u002F02.network\u002F06-fetch-options",{"title":2163,"path":2164,"stem":2165},"URL Objects - Робота з посиланнями","\u002Fjavascript\u002Fnetwork\u002F07-url-objects","03.javascript\u002F02.network\u002F07-url-objects",{"title":2167,"path":2168,"stem":2169},"XMLHttpRequest - AJAX та низькорівневі запити","\u002Fjavascript\u002Fnetwork\u002F08-xmlhttprequest","03.javascript\u002F02.network\u002F08-xmlhttprequest",{"title":2171,"path":2172,"stem":2173},"Відновлюване завантаження файлів","\u002Fjavascript\u002Fnetwork\u002F09-resumable-upload","03.javascript\u002F02.network\u002F09-resumable-upload",{"title":2175,"path":2176,"stem":2177},"Cookies, document.cookie та світ після \"Cookiepocalypse\"","\u002Fjavascript\u002Fnetwork\u002F10-cookies","03.javascript\u002F02.network\u002F10-cookies",{"title":2179,"path":2180,"stem":2181},"js-cookie: Керування Cookies без Болю","\u002Fjavascript\u002Fnetwork\u002F11-js-cookie","03.javascript\u002F02.network\u002F11-js-cookie",{"title":2183,"path":2184,"stem":2185},"Axios: Потужний HTTP-клієнт для JavaScript","\u002Fjavascript\u002Fnetwork\u002F12-axios","03.javascript\u002F02.network\u002F12-axios",{"title":2187,"icon":2188,"path":2189,"stem":2190,"children":2191,"page":59},"Bom","i-lucide-monitor","\u002Fjavascript\u002Fbom","03.javascript\u002F03.bom",[2192,2196,2200,2204],{"title":2193,"path":2194,"stem":2195},"LocalStorage, SessionStorage та patterns збереження даних","\u002Fjavascript\u002Fbom\u002F01-localstorage","03.javascript\u002F03.bom\u002F01-localstorage",{"title":2197,"path":2198,"stem":2199},"Location Object - Керування адресою сторінки","\u002Fjavascript\u002Fbom\u002F02-location-object","03.javascript\u002F03.bom\u002F02-location-object",{"title":2201,"path":2202,"stem":2203},"History API - Керування історією браузера","\u002Fjavascript\u002Fbom\u002F03-history-api","03.javascript\u002F03.bom\u002F03-history-api",{"title":2205,"path":2206,"stem":2207},"Navigator Object - Ідентифікація та Можливості Пристрою","\u002Fjavascript\u002Fbom\u002F04-navigator-object","03.javascript\u002F03.bom\u002F04-navigator-object",{"title":2209,"icon":2210,"path":2211,"stem":2212,"children":2213},"React","i-devicon-react","\u002Fjavascript\u002Freact","03.javascript\u002F04.react\u002Findex",[2214,2215,2219,2223,2227,2231,2294,2329,2481],{"title":2209,"path":2211,"stem":2212},{"title":2216,"path":2217,"stem":2218},"Робота з Формами в React","\u002Fjavascript\u002Freact\u002Freact-forms","03.javascript\u002F04.react\u002F01.react-forms",{"title":2220,"path":2221,"stem":2222},"React Hook Form: Професійна Робота з Формами","\u002Fjavascript\u002Freact\u002Freact-hook-form","03.javascript\u002F04.react\u002F02.react-hook-form",{"title":2224,"path":2225,"stem":2226},"React Hook Form: Глибоке Розуміння Архітектури та Оптимізації","\u002Fjavascript\u002Freact\u002Freact-hook-form-new","03.javascript\u002F04.react\u002F02.react-hook-form-new",{"title":2228,"path":2229,"stem":2230},"Axios та React: Професійна Архітектура Запитів","\u002Fjavascript\u002Freact\u002Fdata-fetching-axios","03.javascript\u002F04.react\u002F03.data-fetching-axios",{"title":2232,"icon":132,"path":2233,"stem":2234,"children":2235},"Tanstack Query","\u002Fjavascript\u002Freact\u002Ftanstack-query","03.javascript\u002F04.react\u002F04.tanstack-query\u002Findex",[2236,2238,2242,2246,2250,2254,2258,2262,2266,2270,2274,2278,2282,2286,2290],{"title":2237,"path":2233,"stem":2234},"TanStack Query: Майстерність Керування Станом Сервера",{"title":2239,"path":2240,"stem":2241},"Парадигма Server State: Чому useEffect недостатньо","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fserver-state-paradigm","03.javascript\u002F04.react\u002F04.tanstack-query\u002F01.server-state-paradigm",{"title":2243,"path":2244,"stem":2245},"Встановлення та Налаштування: Фундамент","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Finstallation-and-devtools","03.javascript\u002F04.react\u002F04.tanstack-query\u002F02.installation-and-devtools",{"title":2247,"path":2248,"stem":2249},"Основи Запитів та Магія Ключів","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fquery-basics-and-keys","03.javascript\u002F04.react\u002F04.tanstack-query\u002F03.query-basics-and-keys",{"title":2251,"path":2252,"stem":2253},"Синхронізація Даних: Життєвий Цикл Запиту","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fdata-synchronization","03.javascript\u002F04.react\u002F04.tanstack-query\u002F04.data-synchronization",{"title":2255,"path":2256,"stem":2257},"Мутації та Інвалідація: Зміна Даних","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fmutations-and-invalidation","03.javascript\u002F04.react\u002F04.tanstack-query\u002F05.mutations-and-invalidation",{"title":2259,"path":2260,"stem":2261},"Оптимістичні Оновлення: Швидше за Світло","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Foptimistic-updates","03.javascript\u002F04.react\u002F04.tanstack-query\u002F06.optimistic-updates",{"title":2263,"path":2264,"stem":2265},"Пагінація та Infinite Scroll","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fpagination-and-load-more","03.javascript\u002F04.react\u002F04.tanstack-query\u002F07.pagination-and-load-more",{"title":2267,"path":2268,"stem":2269},"Просунуті Патерни та Оптимізація","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fadvanced-patterns","03.javascript\u002F04.react\u002F04.tanstack-query\u002F08.advanced-patterns",{"title":2271,"path":2272,"stem":2273},"Архітектура та Best Practices","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Farchitecture-and-best-practices","03.javascript\u002F04.react\u002F04.tanstack-query\u002F09.architecture-and-best-practices",{"title":2275,"path":2276,"stem":2277},"Server-Side Rendering (SSR) та Гідратація","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fserver-side-rendering","03.javascript\u002F04.react\u002F04.tanstack-query\u002F10.server-side-rendering",{"title":2279,"path":2280,"stem":2281},"Стратегії Тестування","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Ftesting-strategies","03.javascript\u002F04.react\u002F04.tanstack-query\u002F11.testing-strategies",{"title":2283,"path":2284,"stem":2285},"Аутентифікація та Обробка Помилок","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fauthentication-and-errors","03.javascript\u002F04.react\u002F04.tanstack-query\u002F12.authentication-and-errors",{"title":2287,"path":2288,"stem":2289},"React Suspense та Майбутнє","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Freact-suspense","03.javascript\u002F04.react\u002F04.tanstack-query\u002F13.react-suspense",{"title":2291,"path":2292,"stem":2293},"Глибоке Занурення в Продуктивність","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fperformance-deep-dive","03.javascript\u002F04.react\u002F04.tanstack-query\u002F14.performance-deep-dive",{"title":2295,"icon":2210,"path":2296,"stem":2297,"children":2298},"React Router","\u002Fjavascript\u002Freact\u002Freact-router","03.javascript\u002F04.react\u002F05.react-router\u002Findex",[2299,2301,2305,2309,2313,2317,2321,2325],{"title":2300,"path":2296,"stem":2297},"React Router: Навігаційна система сучасного вебу",{"title":2302,"path":2303,"stem":2304},"Налаштування та Базовий Роутинг","\u002Fjavascript\u002Freact\u002Freact-router\u002Fsetup-and-basic-routing","03.javascript\u002F04.react\u002F05.react-router\u002F01.setup-and-basic-routing",{"title":2306,"path":2307,"stem":2308},"Динамічна Навігація","\u002Fjavascript\u002Freact\u002Freact-router\u002Fnavigation-and-links","03.javascript\u002F04.react\u002F05.react-router\u002F02.navigation-and-links",{"title":2310,"path":2311,"stem":2312},"Вкладені Маршрути та Макети","\u002Fjavascript\u002Freact\u002Freact-router\u002Fnested-routes-and-layouts","03.javascript\u002F04.react\u002F05.react-router\u002F03.nested-routes-and-layouts",{"title":2314,"path":2315,"stem":2316},"Динамічні Маршрути та Параметри","\u002Fjavascript\u002Freact\u002Freact-router\u002Fdynamic-routing","03.javascript\u002F04.react\u002F05.react-router\u002F04.dynamic-routing",{"title":2318,"path":2319,"stem":2320},"Data APIs: Loaders та Actions","\u002Fjavascript\u002Freact\u002Freact-router\u002Fdata-loading","03.javascript\u002F04.react\u002F05.react-router\u002F05.data-loading",{"title":2322,"path":2323,"stem":2324},"Просунуті Патерни","\u002Fjavascript\u002Freact\u002Freact-router\u002Fadvanced-patterns","03.javascript\u002F04.react\u002F05.react-router\u002F06.advanced-patterns",{"title":2326,"path":2327,"stem":2328},"Legacy Routing: Компонентний підхід","\u002Fjavascript\u002Freact\u002Freact-router\u002Flegacy-routing","03.javascript\u002F04.react\u002F05.react-router\u002F07.legacy-routing",{"title":2330,"icon":132,"path":2331,"stem":2332,"children":2333},"Redux","\u002Fjavascript\u002Freact\u002Fredux","03.javascript\u002F04.react\u002F06.redux\u002Findex",[2334,2336,2352,2381,2390,2411,2427,2456],{"title":2335,"path":2331,"stem":2332},"Redux: Еволюція управління станом",{"title":14,"icon":15,"path":2337,"stem":2338,"children":2339,"page":59},"\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals",[2340,2344,2348],{"title":2341,"path":2342,"stem":2343},"Вступ до State Management","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fintro-state-management","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F01.intro-state-management",{"title":2345,"path":2346,"stem":2347},"Філософія Redux та Три Принципи","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fredux-philosophy","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F02.redux-philosophy",{"title":2349,"path":2350,"stem":2351},"Чисті функції та Іммутабельність","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fpure-functions-immutability","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F03.pure-functions-immutability",{"title":2353,"icon":132,"path":2354,"stem":2355,"children":2356,"page":59},"Classic Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux",[2357,2361,2365,2369,2373,2377],{"title":2358,"path":2359,"stem":2360},"Створення Store (Classic Redux)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fstore-setup","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F01.store-setup",{"title":2362,"path":2363,"stem":2364},"Actions, Constants та Action Creators","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Factions-constants","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F02.actions-constants",{"title":2366,"path":2367,"stem":2368},"Логіка Reducers","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Freducers","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F03.reducers",{"title":2370,"path":2371,"stem":2372},"Комбінування Reducers (Root Reducer)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fdata-flow","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F04.data-flow",{"title":2374,"path":2375,"stem":2376},"Підключення до React (React-Redux)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Freact-redux-connection","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F05.react-redux-connection",{"title":2378,"path":2379,"stem":2380},"Middleware та Асинхронність (Redux Thunk)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fmiddleware-thunk","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F06.middleware-thunk",{"title":2382,"icon":132,"path":2383,"stem":2384,"children":2385,"page":59},"Transition To Rtk","\u002Fjavascript\u002Freact\u002Fredux\u002Ftransition-to-rtk","03.javascript\u002F04.react\u002F06.redux\u002F03.transition-to-rtk",[2386],{"title":2387,"path":2388,"stem":2389},"Проблеми класичного Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Ftransition-to-rtk\u002Fproblems-with-classic","03.javascript\u002F04.react\u002F06.redux\u002F03.transition-to-rtk\u002F01.problems-with-classic",{"title":2391,"icon":132,"path":2392,"stem":2393,"children":2394,"page":59},"Redux Toolkit","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit",[2395,2399,2403,2407],{"title":2396,"path":2397,"stem":2398},"Налаштування Store з configureStore","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fconfigure-store","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F01.configure-store",{"title":2400,"path":2401,"stem":2402},"createSlice: Революція в Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fcreate-slice","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F02.create-slice",{"title":2404,"path":2405,"stem":2406},"Асинхронність з createAsyncThunk","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fasync-thunks","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F03.async-thunks",{"title":2408,"path":2409,"stem":2410},"04. Entity Adapter: Керування нормалізованим станом","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fentity-adapter","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F04.entity-adapter",{"title":2412,"icon":92,"path":2413,"stem":2414,"children":2415,"page":59},"Advanced","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced",[2416,2420,2424],{"title":2417,"path":2418,"stem":2419},"Мемоізація та Селектори: Повний Гайд по Reselect","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Fselectors-reselect","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F01.selectors-reselect",{"title":2421,"path":2422,"stem":2423},"RTK Query: Архітектура Серверного Кешу","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Frtk-query-intro","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F02.rtk-query-intro",{"title":2271,"path":2425,"stem":2426},"\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Farchitecture-best-practices","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F03.architecture-best-practices",{"title":2428,"icon":132,"path":2429,"stem":2430,"children":2431,"page":59},"Project Kanban","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban",[2432,2436,2440,2444,2448,2452],{"title":2433,"path":2434,"stem":2435},"Проєкт: Kanban Board (Trello Clone)","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fproject-overview","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F01.project-overview",{"title":2437,"path":2438,"stem":2439},"Налаштування та Типізація","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fsetup-and-types","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F02.setup-and-types",{"title":2441,"path":2442,"stem":2443},"Board Slice: Серце Дошки","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fboard-slice","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F03.board-slice",{"title":2445,"path":2446,"stem":2447},"Логіка Drag & Drop","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fdrag-and-drop-logic","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F04.drag-and-drop-logic",{"title":2449,"path":2450,"stem":2451},"Інтеграція з RTK Query","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Frtk-query-integration","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F05.rtk-query-integration",{"title":2453,"path":2454,"stem":2455},"Optimistic Updates","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Foptimistic-updates","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F06.optimistic-updates",{"title":2457,"icon":132,"path":2458,"stem":2459,"children":2460,"page":59},"Testing","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting","03.javascript\u002F04.react\u002F06.redux\u002F07.testing",[2461,2465,2469,2473,2477],{"title":2462,"path":2463,"stem":2464},"Тестування Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Fintro-testing","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F01.intro-testing",{"title":2466,"path":2467,"stem":2468},"Тестування Reducers","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-reducers","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F02.testing-reducers",{"title":2470,"path":2471,"stem":2472},"Тестування Селекторів","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-selectors","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F03.testing-selectors",{"title":2474,"path":2475,"stem":2476},"Тестування Компонентів (Integration)","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-components","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F04.testing-components",{"title":2478,"path":2479,"stem":2480},"Тестування Async Thunks","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-thunks","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F05.testing-thunks",{"title":2482,"icon":132,"path":2483,"stem":2484,"children":2485},"Ui Libraries","\u002Fjavascript\u002Freact\u002Fui-libraries","03.javascript\u002F04.react\u002F07.ui-libraries\u002Findex",[2486,2488,2492,2496,2500,2504,2508],{"title":2487,"path":2483,"stem":2484},"UI Бібліотеки в React",{"title":2489,"path":2490,"stem":2491},"Вступ до UI Бібліотек: Навіщо Винаходити Велосипед Двічі?","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fintroduction-to-ui-libraries","03.javascript\u002F04.react\u002F07.ui-libraries\u002F01.introduction-to-ui-libraries",{"title":2493,"path":2494,"stem":2495},"Філософія shadcn\u002Fui: \"Not a Component Library\"","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-philosophy","03.javascript\u002F04.react\u002F07.ui-libraries\u002F02.shadcn-philosophy",{"title":2497,"path":2498,"stem":2499},"Установка та Налаштування shadcn\u002Fui","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-installation","03.javascript\u002F04.react\u002F07.ui-libraries\u002F03.shadcn-installation",{"title":2501,"path":2502,"stem":2503},"Базові Компоненти shadcn\u002Fui: Фундамент Інтерфейсу","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-basics","03.javascript\u002F04.react\u002F07.ui-libraries\u002F04.shadcn-components-basics",{"title":2505,"path":2506,"stem":2507},"Компоненти Форм: Побудова Інтерактивних Form","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-forms","03.javascript\u002F04.react\u002F07.ui-libraries\u002F05.shadcn-components-forms",{"title":2509,"path":2510,"stem":2511},"Складні Компоненти: Dialog, Dropdown, Table та Command","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-advanced","03.javascript\u002F04.react\u002F07.ui-libraries\u002F06.shadcn-components-advanced",{"title":2513,"icon":2514,"path":2515,"stem":2516,"children":2517,"page":59},"TypeScript","i-devicon-typescript","\u002Fjavascript\u002Ftypescript","03.javascript\u002F05.typescript",[2518,2522,2526,2530,2534,2538,2542,2546],{"title":2519,"path":2520,"stem":2521},"TypeScript: Броня для вашого коду","\u002Fjavascript\u002Ftypescript\u002Fintro-and-basic-types","03.javascript\u002F05.typescript\u002F01.intro-and-basic-types",{"title":2523,"path":2524,"stem":2525},"Майстерність Моделювання Даних: Інтерфейси та Просунуті Типи","\u002Fjavascript\u002Ftypescript\u002Finterfaces-and-advanced-types","03.javascript\u002F05.typescript\u002F02.interfaces-and-advanced-types",{"title":2527,"path":2528,"stem":2529},"Алхімія Типів: Generics та Utility Types","\u002Fjavascript\u002Ftypescript\u002Fgenerics-and-utilities","03.javascript\u002F05.typescript\u002F03.generics-and-utilities",{"title":2531,"path":2532,"stem":2533},"Архітектура та Шаблони: Класи в TypeScript","\u002Fjavascript\u002Ftypescript\u002Fclasses-and-oop","03.javascript\u002F05.typescript\u002F04.classes-and-oop",{"title":2535,"path":2536,"stem":2537},"Продакшн та Екосистема: Advanced Config & Workflow","\u002Fjavascript\u002Ftypescript\u002Fadvanced-patterns-and-config","03.javascript\u002F05.typescript\u002F05.advanced-patterns-and-config",{"title":2539,"path":2540,"stem":2541},"TypeScript у світі React","\u002Fjavascript\u002Ftypescript\u002Freact-basics","03.javascript\u002F05.typescript\u002F06.react-basics",{"title":2543,"path":2544,"stem":2545},"React + TypeScript: Продвинуті патерни","\u002Fjavascript\u002Ftypescript\u002Freact-advanced","03.javascript\u002F05.typescript\u002F07.react-advanced",{"title":2547,"path":2548,"stem":2549},"React + TypeScript: Екосистема та бібліотеки","\u002Fjavascript\u002Ftypescript\u002Freact-ecosystem","03.javascript\u002F05.typescript\u002F08.react-ecosystem",{"title":2551,"icon":2552,"path":2553,"stem":2554,"children":2555,"page":59},"Асинхронність","i-lucide-refresh-cw","\u002Fjavascript\u002Fasync-programming","03.javascript\u002F06.async-programming",[2556,2560,2564],{"title":2557,"path":2558,"stem":2559},"Event Loop: серце асинхронності в JavaScript","\u002Fjavascript\u002Fasync-programming\u002Fevent-loop-fundamentals","03.javascript\u002F06.async-programming\u002F01.event-loop-fundamentals",{"title":2561,"path":2562,"stem":2563},"Task Queue та Microtask Queue: пріоритети виконання","\u002Fjavascript\u002Fasync-programming\u002Ftask-queues","03.javascript\u002F06.async-programming\u002F02.task-queues",{"title":2565,"path":2566,"stem":2567},"Асинхронні патерни: від Callbacks до Async\u002FAwait","\u002Fjavascript\u002Fasync-programming\u002Fasync-patterns","03.javascript\u002F06.async-programming\u002F03.async-patterns",{"title":2569,"path":2570,"stem":2571},"Atomic Design","\u002Fjavascript\u002Fatomic-design","03.javascript\u002F2.atomic-design",{"title":2573,"icon":2574,"path":2575,"stem":2576,"children":2577,"page":59},"Java","i-devicon-java","\u002Fjava","04.java",[2578,2581,2584,2588,2592,2596,2600],{"title":162,"path":2579,"stem":2580},"\u002Fjava\u002Fdata-mapper-part1","04.java\u002F01.data-mapper-part1",{"title":166,"path":2582,"stem":2583},"\u002Fjava\u002Fdata-mapper-part2","04.java\u002F02.data-mapper-part2",{"title":2585,"path":2586,"stem":2587},"Service Layer: Організація бізнес-логіки","\u002Fjava\u002Fservice-layer","04.java\u002F03.service-layer",{"title":2589,"path":2590,"stem":2591},"Rich Domain Model та State Pattern","\u002Fjava\u002Frich-domain-model","04.java\u002F04.rich-domain-model",{"title":2593,"path":2594,"stem":2595},"Патерни для складної бізнес-логіки","\u002Fjava\u002Fbusiness-logic-patterns","04.java\u002F05.business-logic-patterns",{"title":2597,"path":2598,"stem":2599},"Обробка помилок та валідація","\u002Fjava\u002Ferror-handling-validation","04.java\u002F06.error-handling-validation",{"title":2601,"path":2602,"stem":2603,"children":2604,"page":59},"Проектування баз даних","\u002Fjava\u002Fpr2","04.java\u002Fpr2",[2605,2609,2613,2617,2621,2625,2629,2633,2637,2641,2645,2649,2653,2657,2661,2665,2669,2673,2677,2681,2685,2689,2693,2697,2701,2705,2709,2713,2717,2721,2725,2729,2733,2737,2741,2745,2749],{"title":2606,"path":2607,"stem":2608},"Концептуальне моделювання: Мистецтво розуміння предметної області","\u002Fjava\u002Fpr2\u002Fconceptual-modeling","04.java\u002Fpr2\u002F01.conceptual-modeling",{"title":2610,"path":2611,"stem":2612},"Логічне моделювання: Від бізнес-ідей до структур даних","\u002Fjava\u002Fpr2\u002Flogical-modeling","04.java\u002Fpr2\u002F02.logical-modeling",{"title":2614,"path":2615,"stem":2616},"Нормалізація: Гігієна даних та боротьба з аномаліями","\u002Fjava\u002Fpr2\u002Fnormalization","04.java\u002Fpr2\u002F03.normalization",{"title":2618,"path":2619,"stem":2620},"Фізична схема: Від абстракції до DDL","\u002Fjava\u002Fpr2\u002Fphysical-schema","04.java\u002Fpr2\u002F04.physical-schema",{"title":2622,"path":2623,"stem":2624},"Архітектурна класифікація таблиць","\u002Fjava\u002Fpr2\u002Ftable-classification","04.java\u002Fpr2\u002F05.table-classification",{"title":2626,"path":2627,"stem":2628},"Database Migrations: Версіонування схеми з Flyway","\u002Fjava\u002Fpr2\u002Fdatabase-migrations","04.java\u002Fpr2\u002F06.database-migrations",{"title":2630,"path":2631,"stem":2632},"А що, якби це була не реляційна БД?","\u002Fjava\u002Fpr2\u002Fbeyond-relational","04.java\u002Fpr2\u002F07.beyond-relational",{"title":2634,"path":2635,"stem":2636},"Object-Relational Impedance Mismatch: Два світи, що не хочуть дружити","\u002Fjava\u002Fpr2\u002Fimpedance-mismatch","04.java\u002Fpr2\u002F09.impedance-mismatch",{"title":2638,"path":2639,"stem":2640},"JDBC: Перший контакт із базою даних","\u002Fjava\u002Fpr2\u002Fjdbc-fundamentals","04.java\u002Fpr2\u002F10.jdbc-fundamentals",{"title":2642,"path":2643,"stem":2644},"Якість коду: Spotless, SpotBugs та SonarQube","\u002Fjava\u002Fpr2\u002F10a.code-quality","04.java\u002Fpr2\u002F10a.code-quality",{"title":2646,"path":2647,"stem":2648},"Connection Pool: Патерн Object Pool для JDBC-з'єднань","\u002Fjava\u002Fpr2\u002Fconnection-pool","04.java\u002Fpr2\u002F11.connection-pool",{"title":2650,"path":2651,"stem":2652},"Row Data Gateway: Об'єкт як обгортка рядка таблиці","\u002Fjava\u002Fpr2\u002Frow-data-gateway","04.java\u002Fpr2\u002F12.row-data-gateway",{"title":2654,"path":2655,"stem":2656},"Table Data Gateway: Фасад таблиці як архітектурний відступ","\u002Fjava\u002Fpr2\u002Ftable-data-gateway","04.java\u002Fpr2\u002F13.table-data-gateway",{"title":2658,"path":2659,"stem":2660},"Repository + Data Mapper: Правильна шарова архітектура з JDBC","\u002Fjava\u002Fpr2\u002Frepository-data-mapper","04.java\u002Fpr2\u002F14.repository-data-mapper",{"title":2662,"path":2663,"stem":2664},"Identity Map: Кешування сутностей у рамках сесії","\u002Fjava\u002Fpr2\u002Fidentity-map","04.java\u002Fpr2\u002F15.identity-map",{"title":2666,"path":2667,"stem":2668},"Unit of Work: Відстеження змін і координація JDBC-транзакцій","\u002Fjava\u002Fpr2\u002Funit-of-work","04.java\u002Fpr2\u002F16.unit-of-work",{"title":2670,"path":2671,"stem":2672},"Strategy: Замінювані SQL-стратегії для підтримки різних СУБД","\u002Fjava\u002Fpr2\u002Fstrategy-sql","04.java\u002Fpr2\u002F17.strategy-sql",{"title":2674,"path":2675,"stem":2676},"Proxy: Lazy Loading для One-To-Many колекцій","\u002Fjava\u002Fpr2\u002Fproxy-lazy-loading","04.java\u002Fpr2\u002F18.proxy-lazy-loading",{"title":2678,"path":2679,"stem":2680},"Generic Repository через Java Reflection: анотації та динамічний SQL","\u002Fjava\u002Fpr2\u002Fgeneric-repository-reflection","04.java\u002Fpr2\u002F19.generic-repository-reflection",{"title":2682,"path":2683,"stem":2684},"Specification Pattern: Композиція бізнес-правил для складних запитів","\u002Fjava\u002Fpr2\u002Fspecification-pattern","04.java\u002Fpr2\u002F20.specification-pattern",{"title":2686,"path":2687,"stem":2688},"Розширені можливості Specification Pattern: підзапити, агрегації та гібридний підхід","\u002Fjava\u002Fpr2\u002F20a.advanced-specifications","04.java\u002Fpr2\u002F20a.advanced-specifications",{"title":2690,"path":2691,"stem":2692},"Асинхронність у JDBC: Від блокуючих викликів до CompletableFuture","\u002Fjava\u002Fpr2\u002Fasynchronous-jdbc","04.java\u002Fpr2\u002F21.asynchronous-jdbc",{"title":2694,"path":2695,"stem":2696},"Інтеграційне тестування JDBC-репозиторіїв: Embedded H2 та патерн AAA","\u002Fjava\u002Fpr2\u002Fintegration-testing-h2","04.java\u002Fpr2\u002F22.integration-testing-h2",{"title":2698,"path":2699,"stem":2700},"Testcontainers: Тестування з реальною PostgreSQL у Docker-контейнерах","\u002Fjava\u002Fpr2\u002Fintegration-testing-testcontainers","04.java\u002Fpr2\u002F23.integration-testing-testcontainers",{"title":2702,"path":2703,"stem":2704},"Google Guice: Впровадження залежностей у JavaFX-проєкті","\u002Fjava\u002Fpr2\u002Fdependency-injection-guice","04.java\u002Fpr2\u002F24.dependency-injection-guice",{"title":2706,"path":2707,"stem":2708},"JavaFX: Основи побудови графічних інтерфейсів","\u002Fjava\u002Fpr2\u002Fjavafx-fundamentals","04.java\u002Fpr2\u002F25.javafx-fundamentals",{"title":2710,"path":2711,"stem":2712},"Properties та Bindings: Реактивність у JavaFX","\u002Fjava\u002Fpr2\u002Fjavafx-properties-bindings","04.java\u002Fpr2\u002F26.javafx-properties-bindings",{"title":2714,"path":2715,"stem":2716},"MVC vs MVP vs MVVM: Еволюція архітектурних патернів UI","\u002Fjava\u002Fpr2\u002Fui-architecture-patterns","04.java\u002Fpr2\u002F27.ui-architecture-patterns",{"title":2718,"path":2719,"stem":2720},"MVVM на практиці: Побудова ViewModel","\u002Fjava\u002Fpr2\u002Fmvvm-viewmodel-implementation","04.java\u002Fpr2\u002F28.mvvm-viewmodel-implementation",{"title":2722,"path":2723,"stem":2724},"View та Controller: Зв'язування з ViewModel через FXML","\u002Fjava\u002Fpr2\u002Fmvvm-view-controller","04.java\u002Fpr2\u002F29.mvvm-view-controller",{"title":2726,"path":2727,"stem":2728},"Інтеграція MVVM з Guice: Автоматична ін'єкція залежностей","\u002Fjava\u002Fpr2\u002Fmvvm-guice-integration","04.java\u002Fpr2\u002F30.mvvm-guice-integration",{"title":2730,"path":2731,"stem":2732},"Валідація та обробка помилок у MVVM","\u002Fjava\u002Fpr2\u002Fmvvm-validation-error-handling","04.java\u002Fpr2\u002F31.mvvm-validation-error-handling",{"title":2734,"path":2735,"stem":2736},"Навігація та управління екранами у JavaFX MVVM","\u002Fjava\u002Fpr2\u002Fmvvm-navigation-screen-management","04.java\u002Fpr2\u002F32.mvvm-navigation-screen-management",{"title":2738,"path":2739,"stem":2740},"Тестування JavaFX MVVM-додатків","\u002Fjava\u002Fpr2\u002Fmvvm-testing","04.java\u002Fpr2\u002F33.mvvm-testing",{"title":2742,"path":2743,"stem":2744},"Стилізація та теми у JavaFX: CSS та User Experience","\u002Fjava\u002Fpr2\u002Fjavafx-styling-themes","04.java\u002Fpr2\u002F34.javafx-styling-themes",{"title":2746,"path":2747,"stem":2748},"AtlantaFX: Сучасні теми для JavaFX додатків","\u002Fjava\u002Fpr2\u002Fatlantafx-modern-themes","04.java\u002Fpr2\u002F35.atlantafx-modern-themes",{"title":2750,"path":2751,"stem":2752},"Пакування та розповсюдження JavaFX-додатків","\u002Fjava\u002Fpr2\u002Fjar-packaging-distribution","04.java\u002Fpr2\u002F36.jar-packaging-distribution",{"title":2754,"icon":2755,"path":2756,"stem":2757,"children":2758,"page":59},"Python","i-devicon-python","\u002Fpython","05.python",[2759,2763,2766,2770,2774,2778,2782,2786,2790,2794,2798,2802,2806,2810,2814,2875],{"title":2760,"path":2761,"stem":2762},"Модулі, Пакети та Віртуальні Середовища","\u002Fpython\u002Fmodules-packages-venv","05.python\u002F00.modules-packages-venv",{"title":71,"path":2764,"stem":2765},"\u002Fpython\u002Fclasses-objects","05.python\u002F01.classes-objects",{"title":2767,"path":2768,"stem":2769},"Інкапсуляція, Керування Доступом та Властивості","\u002Fpython\u002Fencapsulation","05.python\u002F02.encapsulation",{"title":2771,"path":2772,"stem":2773},"Наслідування, MRO та суперсила super()","\u002Fpython\u002Finheritance-mro","05.python\u002F03.inheritance-mro",{"title":2775,"path":2776,"stem":2777},"Абстракція — ABC проти Статичних Протоколів (PEP 544)","\u002Fpython\u002Fabstraction-protocols","05.python\u002F04.abstraction-protocols",{"title":2779,"path":2780,"stem":2781},"Магічні методи (Dunder) та Емуляція протоколів","\u002Fpython\u002Fdunder-methods","05.python\u002F05.dunder-methods",{"title":2783,"path":2784,"stem":2785},"Декоратори та Керування життєвим циклом методів","\u002Fpython\u002Fdecorators-static-class","05.python\u002F06.decorators-static-class",{"title":2787,"path":2788,"stem":2789},"Дескриптори — Магія доступу до атрибутів","\u002Fpython\u002Fdescriptors","05.python\u002F07.descriptors",{"title":2791,"path":2792,"stem":2793},"Метакласи — Динамічне створення класів під капотом CPython","\u002Fpython\u002Fmetaclasses","05.python\u002F08.metaclasses",{"title":2795,"path":2796,"stem":2797},"Dataclasses, NamedTuple та сучасні контейнери Python","\u002Fpython\u002Fmodern-containers","05.python\u002F09.modern-containers",{"title":2799,"path":2800,"stem":2801},"GIL та модель конкурентності CPython — фундамент перед потоками і процесами","\u002Fpython\u002Fgil-concurrency-intro","05.python\u002F11.gil-concurrency-intro",{"title":2803,"path":2804,"stem":2805},"Threading — конкурентність для I\u002FO-bound задач","\u002Fpython\u002Fthreading","05.python\u002F12.threading",{"title":2807,"path":2808,"stem":2809},"Multiprocessing — справжній паралелізм для CPU-bound задач","\u002Fpython\u002Fmultiprocessing","05.python\u002F13.multiprocessing",{"title":2811,"path":2812,"stem":2813},"asyncio — кооперативна конкурентність та event loop","\u002Fpython\u002Fasyncio","05.python\u002F14.asyncio",{"title":2815,"icon":92,"path":2816,"stem":2817,"children":2818,"page":59},"FastAPI","\u002Fpython\u002Ffastapi","05.python\u002Ffastapi",[2819,2823,2827,2831,2835,2839,2843,2847,2851,2855,2859,2863,2867,2871],{"title":2820,"path":2821,"stem":2822},"Глибокий Typing та Pydantic v2 — від анотацій до валідації","\u002Fpython\u002Ffastapi\u002Ftyping-pydantic","05.python\u002Ffastapi\u002F15.typing-pydantic",{"title":2824,"path":2825,"stem":2826},"WSGI, ASGI та Python Web-екосистема","\u002Fpython\u002Ffastapi\u002Fwsgi-asgi-ecosystem","05.python\u002Ffastapi\u002F16.wsgi-asgi-ecosystem",{"title":2828,"path":2829,"stem":2830},"FastAPI: Перший додаток, Uvicorn та OpenAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-intro","05.python\u002Ffastapi\u002F17.fastapi-intro",{"title":2832,"path":2833,"stem":2834},"Маршрутизація, параметри запитів та APIRouter","\u002Fpython\u002Ffastapi\u002Ffastapi-routing-params","05.python\u002Ffastapi\u002F18.fastapi-routing-params",{"title":2836,"path":2837,"stem":2838},"Pydantic v2 у FastAPI — схеми, валідація та серіалізація","\u002Fpython\u002Ffastapi\u002Ffastapi-pydantic-schemas","05.python\u002Ffastapi\u002F19.fastapi-pydantic-schemas",{"title":2840,"path":2841,"stem":2842},"Dependency Injection — серце архітектури FastAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-dependency-injection","05.python\u002Ffastapi\u002F20.fastapi-dependency-injection",{"title":2844,"path":2845,"stem":2846},"Обробка помилок, Middleware та CORS у FastAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-errors-middleware","05.python\u002Ffastapi\u002F21.fastapi-errors-middleware",{"title":2848,"path":2849,"stem":2850},"SQLAlchemy 2.0 — ORM, Core та Async Engine","\u002Fpython\u002Ffastapi\u002Fsqlalchemy-orm","05.python\u002Ffastapi\u002F22.sqlalchemy-orm",{"title":2852,"path":2853,"stem":2854},"Alembic — міграції бази даних","\u002Fpython\u002Ffastapi\u002Falembic-migrations","05.python\u002Ffastapi\u002F23.alembic-migrations",{"title":2856,"path":2857,"stem":2858},"Repository Pattern та Clean Architecture у FastAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-repository-clean-arch","05.python\u002Ffastapi\u002F24.fastapi-repository-clean-arch",{"title":2860,"path":2861,"stem":2862},"Автентифікація та авторизація — JWT, OAuth2, RBAC","\u002Fpython\u002Ffastapi\u002Ffastapi-auth-security","05.python\u002Ffastapi\u002F25.fastapi-auth-security",{"title":2864,"path":2865,"stem":2866},"Тестування FastAPI — pytest, httpx, fixtures","\u002Fpython\u002Ffastapi\u002Ffastapi-testing","05.python\u002Ffastapi\u002F26.fastapi-testing",{"title":2868,"path":2869,"stem":2870},"Async на повну — Background Tasks, WebSockets, SSE та Celery","\u002Fpython\u002Ffastapi\u002Ffastapi-async-advanced","05.python\u002Ffastapi\u002F27.fastapi-async-advanced",{"title":2872,"path":2873,"stem":2874},"Deployment — Docker, CI\u002FCD, Monitoring","\u002Fpython\u002Ffastapi\u002Ffastapi-deployment","05.python\u002Ffastapi\u002F28.fastapi-deployment",{"title":2876,"path":2877,"stem":2878},"[object Object]","\u002Fpython\u002Foop-plan","05.python\u002Foop-plan",{"title":2880,"icon":2881,"path":2882,"stem":2883,"children":2884,"page":59},"Бази даних","i-lucide-database","\u002Fdatabases","06.databases",[2885,2915,2938,2975,3004,3022,3056,3068,3077],{"title":2886,"icon":2887,"path":2888,"stem":2889,"children":2890,"page":59},"Intro","i-lucide-play","\u002Fdatabases\u002Fintro","06.databases\u002F01.intro",[2891,2895,2899,2903,2907,2911],{"title":2892,"path":2893,"stem":2894},"Введення в теорію баз даних","\u002Fdatabases\u002Fintro\u002Fintroduction-to-databases","06.databases\u002F01.intro\u002F01.introduction-to-databases",{"title":2896,"path":2897,"stem":2898},"Реляційна модель даних","\u002Fdatabases\u002Fintro\u002Frelational-model-theory","06.databases\u002F01.intro\u002F02.relational-model-theory",{"title":2900,"path":2901,"stem":2902},"ER-моделювання","\u002Fdatabases\u002Fintro\u002Fer-modeling","06.databases\u002F01.intro\u002F03.er-modeling",{"title":2904,"path":2905,"stem":2906},"Логічне проектування БД","\u002Fdatabases\u002Fintro\u002Flogical-schema","06.databases\u002F01.intro\u002F04.logical-schema",{"title":2908,"path":2909,"stem":2910},"Класифікація таблиць","\u002Fdatabases\u002Fintro\u002Ftable-classification","06.databases\u002F01.intro\u002F05.table-classification",{"title":2912,"path":2913,"stem":2914},"PlantUML для баз даних","\u002Fdatabases\u002Fintro\u002Fplantuml-diagrams","06.databases\u002F01.intro\u002F06.plantuml-diagrams",{"title":2916,"icon":2881,"path":2917,"stem":2918,"children":2919,"page":59},"MS SQL Server Start","\u002Fdatabases\u002Fms-sql-server-start","06.databases\u002F02.ms-sql-server-start",[2920,2924,2930,2934],{"title":2921,"path":2922,"stem":2923},"Типи даних у MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fdata-types","06.databases\u002F02.ms-sql-server-start\u002F01.data-types",{"title":2925,"path":2926,"stem":2927,"children":2928},"Індекси у MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fsql-indexes","06.databases\u002F02.ms-sql-server-start\u002F02.sql-indexes",[2929],{"title":2925,"path":2926,"stem":2927},{"title":2931,"path":2932,"stem":2933},"Системні бази даних MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fsystem-databases","06.databases\u002F02.ms-sql-server-start\u002F03.system-databases",{"title":2935,"path":2936,"stem":2937},"Огляд мови SQL та запитів","\u002Fdatabases\u002Fms-sql-server-start\u002Fsql-queries-overview","06.databases\u002F02.ms-sql-server-start\u002F04.sql-queries-overview",{"title":2939,"icon":2881,"path":2940,"stem":2941,"children":2942,"page":59},"SQL","\u002Fdatabases\u002Fsql","06.databases\u002F03.sql",[2943,2947,2951,2955,2959,2963,2967,2971],{"title":2944,"path":2945,"stem":2946},"Налаштування демонстраційної бази даних","\u002Fdatabases\u002Fsql\u002Fsample-database-setup","06.databases\u002F03.sql\u002F00.sample-database-setup",{"title":2948,"path":2949,"stem":2950},"DDL - Створення таблиць (CREATE TABLE)","\u002Fdatabases\u002Fsql\u002Fddl-create-table","06.databases\u002F03.sql\u002F01.ddl-create-table",{"title":2952,"path":2953,"stem":2954},"DDL - Зміна та видалення таблиць (ALTER, DROP)","\u002Fdatabases\u002Fsql\u002Fddl-alter-drop-table","06.databases\u002F03.sql\u002F02.ddl-alter-drop-table",{"title":2956,"path":2957,"stem":2958},"SELECT запити - Основи","\u002Fdatabases\u002Fsql\u002Fselect-queries-fundamentals","06.databases\u002F03.sql\u002F03.select-queries-fundamentals",{"title":2960,"path":2961,"stem":2962},"SELECT запити - Розширені можливості","\u002Fdatabases\u002Fsql\u002Fselect-queries-advanced","06.databases\u002F03.sql\u002F04.select-queries-advanced",{"title":2964,"path":2965,"stem":2966},"INSERT запити - Додавання даних","\u002Fdatabases\u002Fsql\u002Finsert-queries","06.databases\u002F03.sql\u002F05.insert-queries",{"title":2968,"path":2969,"stem":2970},"UPDATE та DELETE запити","\u002Fdatabases\u002Fsql\u002Fupdate-delete-queries","06.databases\u002F03.sql\u002F06.update-delete-queries",{"title":2972,"path":2973,"stem":2974},"Транзакції в SQL","\u002Fdatabases\u002Fsql\u002Ftransactions","06.databases\u002F03.sql\u002F07.transactions",{"title":2976,"icon":2881,"path":2977,"stem":2978,"children":2979,"page":59},"Multi Table Databases","\u002Fdatabases\u002Fmulti-table-databases","06.databases\u002F04.multi-table-databases",[2980,2984,2988,2992,2996,3000],{"title":2981,"path":2982,"stem":2983},"Зв'язки та нормалізація БД","\u002Fdatabases\u002Fmulti-table-databases\u002Frelationships-and-normalization","06.databases\u002F04.multi-table-databases\u002F00.relationships-and-normalization",{"title":2985,"path":2986,"stem":2987},"INNER JOIN - З'єднання таблиць","\u002Fdatabases\u002Fmulti-table-databases\u002Finner-join","06.databases\u002F04.multi-table-databases\u002F01.inner-join",{"title":2989,"path":2990,"stem":2991},"OUTER JOINs - LEFT, RIGHT, FULL","\u002Fdatabases\u002Fmulti-table-databases\u002Fouter-joins","06.databases\u002F04.multi-table-databases\u002F02.outer-joins",{"title":2993,"path":2994,"stem":2995},"CROSS та SELF JOINs","\u002Fdatabases\u002Fmulti-table-databases\u002Fcross-self-joins","06.databases\u002F04.multi-table-databases\u002F03.cross-self-joins",{"title":2997,"path":2998,"stem":2999},"Підзапити (Subqueries)","\u002Fdatabases\u002Fmulti-table-databases\u002Fsubqueries","06.databases\u002F04.multi-table-databases\u002F04.subqueries",{"title":3001,"path":3002,"stem":3003},"Агрегації з JOIN","\u002Fdatabases\u002Fmulti-table-databases\u002Faggregations-with-joins","06.databases\u002F04.multi-table-databases\u002F05.aggregations-with-joins",{"title":3005,"icon":3006,"path":3007,"stem":3008,"children":3009,"page":59},"Aggregate Functions","i-lucide-calculator","\u002Fdatabases\u002Faggregate-functions","06.databases\u002F05.aggregate-functions",[3010,3014,3018],{"title":3011,"path":3012,"stem":3013},"Функції агрегування в MS SQL Server","\u002Fdatabases\u002Faggregate-functions\u002Fintroduction-aggregate-functions","06.databases\u002F05.aggregate-functions\u002F01.introduction-aggregate-functions",{"title":3015,"path":3016,"stem":3017},"Групування даних в MS SQL Server","\u002Fdatabases\u002Faggregate-functions\u002Fgrouping-data","06.databases\u002F05.aggregate-functions\u002F02.grouping-data",{"title":3019,"path":3020,"stem":3021},"Підзапити з агрегатними функціями","\u002Fdatabases\u002Faggregate-functions\u002Fsubqueries-aggregates","06.databases\u002F05.aggregate-functions\u002F03.subqueries-aggregates",{"title":3023,"icon":3024,"path":3025,"stem":3026,"children":3027,"page":59},"Тригери та зберігаємі процедури","i-lucide-database-zap","\u002Fdatabases\u002Ftriggers-stored-procedures","06.databases\u002F07.triggers-stored-procedures",[3028,3032,3036,3040,3044,3048,3052],{"title":3029,"path":3030,"stem":3031},"DML-тригери","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fdml-triggers","06.databases\u002F07.triggers-stored-procedures\u002F01.dml-triggers",{"title":3033,"path":3034,"stem":3035},"DDL-тригери","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fddl-triggers","06.databases\u002F07.triggers-stored-procedures\u002F02.ddl-triggers",{"title":3037,"path":3038,"stem":3039},"Transact-SQL розширення","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Ftransact-sql-extensions","06.databases\u002F07.triggers-stored-procedures\u002F03.transact-sql-extensions",{"title":3041,"path":3042,"stem":3043},"Транзакції","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Ftransactions","06.databases\u002F07.triggers-stored-procedures\u002F04.transactions",{"title":3045,"path":3046,"stem":3047},"Зберігаємі процедури","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fstored-procedures","06.databases\u002F07.triggers-stored-procedures\u002F05.stored-procedures",{"title":3049,"path":3050,"stem":3051},"Користувацькі функції","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fuser-defined-functions","06.databases\u002F07.triggers-stored-procedures\u002F06.user-defined-functions",{"title":3053,"path":3054,"stem":3055},"Безпека баз даних","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fsecurity","06.databases\u002F07.triggers-stored-procedures\u002F08.security",{"title":3053,"icon":793,"path":3057,"stem":3058,"children":3059,"page":59},"\u002Fdatabases\u002Fsecurity","06.databases\u002F08.security",[3060,3064],{"title":3061,"path":3062,"stem":3063},"Вступ до безпеки баз даних","\u002Fdatabases\u002Fsecurity\u002Fintroduction","06.databases\u002F08.security\u002F01.introduction",{"title":3065,"path":3066,"stem":3067},"Системні представлення та метадані","\u002Fdatabases\u002Fsecurity\u002Fsystem-views","06.databases\u002F08.security\u002F02.system-views",{"title":3069,"icon":3070,"path":3071,"stem":3072,"children":3073,"page":59},"Резервне копіювання та відновлення","i-lucide-database-backup","\u002Fdatabases\u002Fbackup-recovery","06.databases\u002F09.backup-recovery",[3074],{"title":3069,"path":3075,"stem":3076},"\u002Fdatabases\u002Fbackup-recovery\u002Fbackup-restore","06.databases\u002F09.backup-recovery\u002F01.backup-restore",{"title":3078,"icon":3079,"path":3080,"stem":3081,"children":3082,"page":59},"Повнотекстовий пошук","i-lucide-search","\u002Fdatabases\u002Ffull-text-search","06.databases\u002F10.full-text-search",[3083],{"title":3078,"path":3084,"stem":3085},"\u002Fdatabases\u002Ffull-text-search\u002Ffull-text-search","06.databases\u002F10.full-text-search\u002F01.full-text-search",{"title":3087,"icon":3088,"path":3089,"stem":3090,"children":3091,"page":59},"Tools","i-lucide-wrench","\u002Ftools","07.tools",[3092,3168],{"title":3093,"icon":3094,"path":3095,"stem":3096,"children":3097},"Docker","i-simple-icons-docker","\u002Ftools\u002Fdocker","07.tools\u002F01.docker\u002Findex",[3098,3100,3104,3108,3112,3116,3120,3124,3128,3132,3136,3140,3144,3148,3152,3156,3160,3164],{"title":3099,"path":3095,"stem":3096},"Docker: від нуля до production",{"title":3101,"path":3102,"stem":3103},"Контейнеризація — від проблеми до рішення","\u002Ftools\u002Fdocker\u002Fcontainerization-concept","07.tools\u002F01.docker\u002F01.containerization-concept",{"title":3105,"path":3106,"stem":3107},"Docker — що це і навіщо?","\u002Ftools\u002Fdocker\u002Fdocker-what-and-why","07.tools\u002F01.docker\u002F02.docker-what-and-why",{"title":3109,"path":3110,"stem":3111},"Архітектура Docker Engine","\u002Ftools\u002Fdocker\u002Fdocker-architecture","07.tools\u002F01.docker\u002F03.docker-architecture",{"title":3113,"path":3114,"stem":3115},"Встановлення Docker","\u002Ftools\u002Fdocker\u002Finstallation","07.tools\u002F01.docker\u002F04.installation",{"title":3117,"path":3118,"stem":3119},"Перший контейнер — docker run","\u002Ftools\u002Fdocker\u002Ffirst-container","07.tools\u002F01.docker\u002F05.first-container",{"title":3121,"path":3122,"stem":3123},"Життєвий цикл контейнера","\u002Ftools\u002Fdocker\u002Fcontainer-lifecycle","07.tools\u002F01.docker\u002F06.container-lifecycle",{"title":3125,"path":3126,"stem":3127},"Docker Images — фундаментальні концепції","\u002Ftools\u002Fdocker\u002Fdocker-images-fundamentals","07.tools\u002F01.docker\u002F07.docker-images-fundamentals",{"title":3129,"path":3130,"stem":3131},"Dockerfile — основи","\u002Ftools\u002Fdocker\u002Fdockerfile-basics","07.tools\u002F01.docker\u002F08.dockerfile-basics",{"title":3133,"path":3134,"stem":3135},"Dockerfile — просунуті техніки","\u002Ftools\u002Fdocker\u002Fdockerfile-advanced","07.tools\u002F01.docker\u002F09.dockerfile-advanced",{"title":3137,"path":3138,"stem":3139},"Build Context та кешування шарів","\u002Ftools\u002Fdocker\u002Fbuild-context-and-cache","07.tools\u002F01.docker\u002F10.build-context-and-cache",{"title":3141,"path":3142,"stem":3143},"Реєстри Docker-образів","\u002Ftools\u002Fdocker\u002Fimage-registries","07.tools\u002F01.docker\u002F11.image-registries",{"title":3145,"path":3146,"stem":3147},"Контейнеризація .NET додатків","\u002Ftools\u002Fdocker\u002Fdotnet-containerization","07.tools\u002F01.docker\u002F12.dotnet-containerization",{"title":3149,"path":3150,"stem":3151},"Томи та збереження даних","\u002Ftools\u002Fdocker\u002Fvolumes-and-data","07.tools\u002F01.docker\u002F13.volumes-and-data",{"title":3153,"path":3154,"stem":3155},"Основи мережі в Docker","\u002Ftools\u002Fdocker\u002Fnetworking-basics","07.tools\u002F01.docker\u002F14.networking-basics",{"title":3157,"path":3158,"stem":3159},"Змінні оточення та конфігурація","\u002Ftools\u002Fdocker\u002Fenvironment-and-configuration","07.tools\u002F01.docker\u002F15.environment-and-configuration",{"title":3161,"path":3162,"stem":3163},"Docker Compose — оркестрація контейнерів","\u002Ftools\u002Fdocker\u002Fdocker-compose-basics","07.tools\u002F01.docker\u002F16.docker-compose-basics",{"title":3165,"path":3166,"stem":3167},"Docker Compose — Multi-Service застосунки","\u002Ftools\u002Fdocker\u002Fcompose-multi-service","07.tools\u002F01.docker\u002F17.compose-multi-service",{"title":3169,"icon":3170,"path":3171,"stem":3172,"children":3173},"Kubernetes","simple-icons:kubernetes","\u002Ftools\u002Fkubernetes","07.tools\u002F02.kubernetes\u002Findex",[3174,3176,3180,3184,3188,3192,3196,3200,3204],{"title":3175,"path":3171,"stem":3172},"Kubernetes: від розробки до production",{"title":3177,"path":3178,"stem":3179},"Kubernetes — коли Docker Compose більше не вистачає","\u002Ftools\u002Fkubernetes\u002Fwhy-kubernetes","07.tools\u002F02.kubernetes\u002F01.why-kubernetes",{"title":3181,"path":3182,"stem":3183},"Архітектура Kubernetes — анатомія кластера","\u002Ftools\u002Fkubernetes\u002Fkubernetes-architecture","07.tools\u002F02.kubernetes\u002F02.kubernetes-architecture",{"title":3185,"path":3186,"stem":3187},"Локальне середовище — minikube, kind та k3s","\u002Ftools\u002Fkubernetes\u002Flocal-environment","07.tools\u002F02.kubernetes\u002F03.local-environment",{"title":3189,"path":3190,"stem":3191},"Pod — атомарна одиниця Kubernetes","\u002Ftools\u002Fkubernetes\u002Fpods-and-containers","07.tools\u002F02.kubernetes\u002F04.pods-and-containers",{"title":3193,"path":3194,"stem":3195},"Патерни використання Pod","\u002Ftools\u002Fkubernetes\u002Fpod-patterns","07.tools\u002F02.kubernetes\u002F05.pod-patterns",{"title":3197,"path":3198,"stem":3199},"Deployment — декларативне управління Pod","\u002Ftools\u002Fkubernetes\u002Fdeployment-basics","07.tools\u002F02.kubernetes\u002F06.deployment-basics",{"title":3201,"path":3202,"stem":3203},"Rolling Updates та управління життєвим циклом Deployment","\u002Ftools\u002Fkubernetes\u002Fdeployment-rolling-updates","07.tools\u002F02.kubernetes\u002F07.deployment-rolling-updates",{"title":3205,"path":3206,"stem":3207},"Service — мережева абстракція для Pod","\u002Ftools\u002Fkubernetes\u002Fservices-networking","07.tools\u002F02.kubernetes\u002F08.services-networking",{"title":3209,"icon":3210,"path":3211,"stem":3212,"children":3213,"page":59},"Software Engineering","i-lucide-code-2","\u002Fsoftware-engineering","09.software-engineering",[3214,3218,3222,3226,3230,3234,3238,3242,3246,3250,3254],{"title":3215,"path":3216,"stem":3217},"1. Аналіз предметної області. Експертні знання та складність","\u002Fsoftware-engineering\u002Fintro-subdomains","09.software-engineering\u002F01.intro-subdomains",{"title":3219,"path":3220,"stem":3221},"2. Обмежені контексти. Інтеграція обмежених контекстів","\u002Fsoftware-engineering\u002Fintegrating-limited-contexts","09.software-engineering\u002F02.integrating-limited-contexts",{"title":3223,"path":3224,"stem":3225},"3. Реалізація простої бізнес-логіки","\u002Fsoftware-engineering\u002Fsimple","09.software-engineering\u002F03.simple",{"title":3227,"path":3228,"stem":3229},"4. Опрацювання складної бізнес-логіки","\u002Fsoftware-engineering\u002Fcomplex-business-logic","09.software-engineering\u002F04.complex-business-logic",{"title":3231,"path":3232,"stem":3233},"5. Моделювання фактора часу. Подієво-орієнтована архітектура.","\u002Fsoftware-engineering\u002Fmodelling-the-time-factor","09.software-engineering\u002F05.modelling-the-time-factor",{"title":3235,"path":3236,"stem":3237},"6. Архітектурні патерни","\u002Fsoftware-engineering\u002Farchitectural-patterns","09.software-engineering\u002F06.architectural-patterns",{"title":3239,"path":3240,"stem":3241},"Паттерни взаємодії","\u002Fsoftware-engineering\u002Fpatterns-of-interaction","09.software-engineering\u002F07.patterns-of-interaction",{"title":3243,"path":3244,"stem":3245},"Евристика проєктування","\u002Fsoftware-engineering\u002Fdesign-heuristics","09.software-engineering\u002F08.design-heuristics",{"title":3247,"path":3248,"stem":3249},"Еволюція проєктних рішень","\u002Fsoftware-engineering\u002Fevolution-of-design-solutions","09.software-engineering\u002F09.evolution-of-design-solutions",{"title":3251,"path":3252,"stem":3253},"EventStorming","\u002Fsoftware-engineering\u002Feventstorming","09.software-engineering\u002F10.eventstorming",{"title":3255,"path":3256,"stem":3257},"DDD на практиці","\u002Fsoftware-engineering\u002Fddd-in-practice","09.software-engineering\u002F11.ddd-in-practice",{"title":3259,"icon":943,"path":3260,"stem":3261,"children":3262,"page":59},"DDD","\u002Fddd","10.ddd",[3263,3267,3271,3275,3279,3283,3287,3291,3295,3299,3303,3307,3311],{"title":3264,"path":3265,"stem":3266},"Аналіз предметної області","\u002Fddd\u002Fdomain-analysis","10.ddd\u002F01.domain-analysis",{"title":3268,"path":3269,"stem":3270},"Експертні знання про предметну область","\u002Fddd\u002Fdomain-expert-knowledge","10.ddd\u002F02.domain-expert-knowledge",{"title":3272,"path":3273,"stem":3274},"Як осмислити складність предметної області","\u002Fddd\u002Fmanaging-domain-complexity","10.ddd\u002F03.managing-domain-complexity",{"title":3276,"path":3277,"stem":3278},"Інтеграція обмежених контекстів","\u002Fddd\u002Fbounded-context-integration","10.ddd\u002F04.bounded-context-integration",{"title":3280,"path":3281,"stem":3282},"Реалізація простої бізнес-логіки","\u002Fddd\u002Fsimple-business-logic","10.ddd\u002F05.simple-business-logic",{"title":3284,"path":3285,"stem":3286},"Обробка складної бізнес-логіки","\u002Fddd\u002Fcomplex-business-logic","10.ddd\u002F06.complex-business-logic",{"title":3288,"path":3289,"stem":3290},"Моделювання фактора часу","\u002Fddd\u002Ftime-modeling","10.ddd\u002F07.time-modeling",{"title":3292,"path":3293,"stem":3294},"Глава 8. Архітектурні Патерни","\u002Fddd\u002Farchitectural-patterns","10.ddd\u002F08.architectural-patterns",{"title":3296,"path":3297,"stem":3298},"Глава 9. Патерни Взаємодії","\u002Fddd\u002Finteraction-patterns","10.ddd\u002F09.interaction-patterns",{"title":3300,"path":3301,"stem":3302},"Глава 10. Проектні Евристики","\u002Fddd\u002Fdesign-heuristics","10.ddd\u002F10.design-heuristics",{"title":3304,"path":3305,"stem":3306},"Глава 11. Еволюція Проектних Рішень","\u002Fddd\u002Fevolution-of-design-decisions","10.ddd\u002F11.evolution-of-design-decisions",{"title":3308,"path":3309,"stem":3310},"Глава 12. EventStorming","\u002Fddd\u002Fevent-storming","10.ddd\u002F12.event-storming",{"title":3312,"path":3313,"stem":3314},"Глава 13. DDD на Практиці","\u002Fddd\u002Fddd-in-practice","10.ddd\u002F13.ddd-in-practice",{"title":3316,"icon":3317,"path":3318,"stem":3319,"children":3320,"page":59},"Media Streaming","i-lucide-video","\u002Fmedia-streaming","11.media-streaming",[3321,3325,3329,3333,3337,3341,3345],{"title":3322,"path":3323,"stem":3324},"01. Магія Стрімінгу: Що відбувається, коли ви натискаєте \"Play\"","\u002Fmedia-streaming\u002Fintroduction","11.media-streaming\u002F01.introduction",{"title":3326,"path":3327,"stem":3328},"02. Анатомія Медіа: Кодеки, Контейнери та Стиснення","\u002Fmedia-streaming\u002Faudio-video-anatomy","11.media-streaming\u002F02.audio-video-anatomy",{"title":3330,"path":3331,"stem":3332},"03. The Gym: FFmpeg Deep Dive","\u002Fmedia-streaming\u002Fffmpeg-gym","11.media-streaming\u002F03.ffmpeg-gym",{"title":3334,"path":3335,"stem":3336},"04. HLS Protocol: HTTP Live Streaming у Деталях","\u002Fmedia-streaming\u002Fhls-protocol","11.media-streaming\u002F04.hls-protocol",{"title":3338,"path":3339,"stem":3340},"05. DASH Protocol: Відкритий Стандарт","\u002Fmedia-streaming\u002Fdash-protocol","11.media-streaming\u002F05.dash-protocol",{"title":3342,"path":3343,"stem":3344},"06. Масштабування: CDN та Adaptive Bitrate","\u002Fmedia-streaming\u002Fcdn-and-adaptive-bitrate","11.media-streaming\u002F06.cdn-and-adaptive-bitrate",{"title":3346,"path":3347,"stem":3348},"07. Війна із Затримкою (Latency)","\u002Fmedia-streaming\u002Frealtime-latency","11.media-streaming\u002F07.realtime-latency",{"title":3350,"icon":3351,"path":3352,"stem":3353,"children":3354,"page":59},"HTML & CSS","i-devicon-html5","\u002Fhtml-css","12.html-css",[3355,3359,3363,3367,3371,3375,3379,3383,3387,3391,3395,3399,3403,3407,3411,3415,3419,3423,3427,3431,3435,3439,3443,3447,3451,3455,3459,3463,3467,3471],{"title":3356,"path":3357,"stem":3358},"Вступ до HTML. Структура документа","\u002Fhtml-css\u002Fintro-html-structure","12.html-css\u002F01.intro-html-structure",{"title":3360,"path":3361,"stem":3362},"Форматування тексту в HTML","\u002Fhtml-css\u002Fhtml-text-formatting","12.html-css\u002F02.html-text-formatting",{"title":3364,"path":3365,"stem":3366},"Посилання та зображення в HTML","\u002Fhtml-css\u002Fhtml-links-images","12.html-css\u002F03.html-links-images",{"title":3368,"path":3369,"stem":3370},"Списки та таблиці в HTML","\u002Fhtml-css\u002Fhtml-lists-tables","12.html-css\u002F04.html-lists-tables",{"title":3372,"path":3373,"stem":3374},"Форми в HTML","\u002Fhtml-css\u002Fhtml-forms","12.html-css\u002F05.html-forms",{"title":3376,"path":3377,"stem":3378},"Семантичні елементи HTML5","\u002Fhtml-css\u002Fhtml-semantic-elements","12.html-css\u002F06.html-semantic-elements",{"title":3380,"path":3381,"stem":3382},"Мультимедіа та розширені елементи HTML","\u002Fhtml-css\u002Fhtml-multimedia-advanced","12.html-css\u002F07.html-multimedia-advanced",{"title":3384,"path":3385,"stem":3386},"Мікророзмітка та SEO в HTML","\u002Fhtml-css\u002Fhtml-microdata-seo","12.html-css\u002F08.html-microdata-seo",{"title":3388,"path":3389,"stem":3390},"Вступ до CSS. Селектори та специфічність","\u002Fhtml-css\u002Fcss-intro-selectors","12.html-css\u002F09.css-intro-selectors",{"title":3392,"path":3393,"stem":3394},"Блокова модель CSS. Відступи. Box Sizing","\u002Fhtml-css\u002Fcss-box-model","12.html-css\u002F10.css-box-model",{"title":3396,"path":3397,"stem":3398},"Розміри у CSS: повний довідник одиниць і ключових слів","\u002Fhtml-css\u002F10a.css-sizing","12.html-css\u002F10a.css-sizing",{"title":3400,"path":3401,"stem":3402},"Типографіка в CSS. Шрифти та текст","\u002Fhtml-css\u002Fcss-typography","12.html-css\u002F11.css-typography",{"title":3404,"path":3405,"stem":3406},"Кольори та фони в CSS","\u002Fhtml-css\u002Fcss-colors-backgrounds","12.html-css\u002F12.css-colors-backgrounds",{"title":3408,"path":3409,"stem":3410},"Тіні та фільтри в CSS","\u002Fhtml-css\u002F12b.css-shadows-filters","12.html-css\u002F12b.css-shadows-filters",{"title":3412,"path":3413,"stem":3414},"CSS Flexbox: Фундамент гнучких макетів","\u002Fhtml-css\u002Fcss-flexbox-fundamentals","12.html-css\u002F13.css-flexbox-fundamentals",{"title":3416,"path":3417,"stem":3418},"CSS Flexbox: Вирівнювання та Позиціонування","\u002Fhtml-css\u002Fcss-flexbox-alignment-sizing-and-patterns","12.html-css\u002F14.css-flexbox-alignment-sizing-and-patterns",{"title":3420,"path":3421,"stem":3422},"CSS Grid. Двовимірний макет. Частина 1","\u002Fhtml-css\u002Fcss-layout-grid","12.html-css\u002F15.css-layout-grid",{"title":3424,"path":3425,"stem":3426},"CSS Grid. Двовимірний макет. Частина 2","\u002Fhtml-css\u002Fcss-layout-grid-advanced","12.html-css\u002F16.css-layout-grid-advanced",{"title":3428,"path":3429,"stem":3430},"Позиціонування в CSS. Z-index. Stacking Context","\u002Fhtml-css\u002Fcss-positioning","12.html-css\u002F17.css-positioning",{"title":3432,"path":3433,"stem":3434},"CSS Анімації та Переходи","\u002Fhtml-css\u002Fcss-animations-transitions","12.html-css\u002F18.css-animations-transitions",{"title":3436,"path":3437,"stem":3438},"Адаптивний дизайн. Media Queries. Частина 1","\u002Fhtml-css\u002Fcss-responsive-media-queries","12.html-css\u002F19.css-responsive-media-queries",{"title":3440,"path":3441,"stem":3442},"Адаптивний дизайн. Частина 2: clamp(), Container Queries, @layer","\u002Fhtml-css\u002Fcss-responsive-advanced","12.html-css\u002F20.css-responsive-advanced",{"title":3444,"path":3445,"stem":3446},"CSS Custom Properties. Методології. Сучасний CSS","\u002Fhtml-css\u002Fcss-variables-methodologies","12.html-css\u002F21.css-variables-methodologies",{"title":3448,"path":3449,"stem":3450},"Сучасний CSS 2023–2025: Нові можливості","\u002Fhtml-css\u002Fcss-modern-features","12.html-css\u002F22.css-modern-features",{"title":3452,"path":3453,"stem":3454},"CSS Nesting, @layer, @scope та @property: нативний препроцесор","\u002Fhtml-css\u002F22a.css-nesting-modern-syntax","12.html-css\u002F22a.css-nesting-modern-syntax",{"title":3456,"path":3457,"stem":3458},"CSS для форм та інтерактивних станів","\u002Fhtml-css\u002Fcss-forms-interactive-states","12.html-css\u002F23.css-forms-interactive-states",{"title":3460,"path":3461,"stem":3462},"Доступність у CSS (CSS Accessibility)","\u002Fhtml-css\u002Fcss-accessibility","12.html-css\u002F24.css-accessibility",{"title":3464,"path":3465,"stem":3466},"CSS-функції та сучасні sizing primitives","\u002Fhtml-css\u002Fcss-functions-sizing","12.html-css\u002F25.css-functions-sizing",{"title":3468,"path":3469,"stem":3470},"Rendering Pipeline і CSS Performance","\u002Fhtml-css\u002Fcss-rendering-performance","12.html-css\u002F26.css-rendering-performance",{"title":3472,"path":3473,"stem":3474},"CSS Best Practices: типові ситуації та правильні рішення","\u002Fhtml-css\u002Fcss-best-practices","12.html-css\u002F27.css-best-practices",{"title":3476,"path":3477,"stem":3478,"children":3479,"page":59},"AWS","\u002Faws","13.aws",[3480,3484,3488,3492,3496,3500,3504,3508,3512,3516,3520,3524,3528,3532,3536,3540,3544,3548],{"title":3481,"path":3482,"stem":3483},"Реєстрація AWS акаунту та студентські програми","\u002Faws\u002Faccount-registration","13.aws\u002F00.account-registration",{"title":3485,"path":3486,"stem":3487},"Вступ до хмарних обчислень та AWS","\u002Faws\u002Fintroduction-to-cloud","13.aws\u002F01.introduction-to-cloud",{"title":3489,"path":3490,"stem":3491},"AWS IAM — Identity and Access Management","\u002Faws\u002Fiam","13.aws\u002F02.iam",{"title":3493,"path":3494,"stem":3495},"AWS IAM CLI — Довідник команд","\u002Faws\u002F02a.iam-doc","13.aws\u002F02a.iam-doc",{"title":3497,"path":3498,"stem":3499},"Docker та контейнеризація в AWS — ECR, ECS та Fargate","\u002Faws\u002Fdocker-ecs","13.aws\u002F03.docker-ecs",{"title":3501,"path":3502,"stem":3503},"AWS ECR \u002F ECS CLI — Довідник команд","\u002Faws\u002F03a.docker-ecs-doc","13.aws\u002F03a.docker-ecs-doc",{"title":3505,"path":3506,"stem":3507},"Amazon EC2 — Elastic Compute Cloud","\u002Faws\u002Fec2","13.aws\u002F04.ec2",{"title":3509,"path":3510,"stem":3511},"AWS EC2 CLI — Довідник команд","\u002Faws\u002F04a.ec2-doc","13.aws\u002F04a.ec2-doc",{"title":3513,"path":3514,"stem":3515},"Elastic Load Balancing та Auto Scaling","\u002Faws\u002Falb-asg","13.aws\u002F05.alb-asg",{"title":3517,"path":3518,"stem":3519},"Amazon S3 — Simple Storage Service","\u002Faws\u002Fs3","13.aws\u002F06.s3",{"title":3521,"path":3522,"stem":3523},"Amazon CloudFront — Content Delivery Network","\u002Faws\u002Fcloudfront","13.aws\u002F07.cloudfront",{"title":3525,"path":3526,"stem":3527},"Amazon RDS — Relational Database Service","\u002Faws\u002Frds","13.aws\u002F08.rds",{"title":3529,"path":3530,"stem":3531},"Amazon DynamoDB — NoSQL Database","\u002Faws\u002Fdynamodb","13.aws\u002F09.dynamodb",{"title":3533,"path":3534,"stem":3535},"AWS Lambda та Serverless Compute","\u002Faws\u002Flambda","13.aws\u002F10.lambda",{"title":3537,"path":3538,"stem":3539},"Amazon Bedrock - Foundation Models, RAG та Agents","\u002Faws\u002Fbedrock","13.aws\u002F22.bedrock",{"title":3541,"path":3542,"stem":3543},"Amazon Rekognition - Комп'ютерний зір","\u002Faws\u002Frekognition","13.aws\u002F23.rekognition",{"title":3545,"path":3546,"stem":3547},"Amazon Textract - Інтелектуальний аналіз документів","\u002Faws\u002Ftextract","13.aws\u002F24.textract",{"title":3549,"path":3550,"stem":3551},"Amazon Polly, Transcribe, Comprehend та Translate","\u002Faws\u002Faudio-nlp-services","13.aws\u002F25.audio-nlp-services",{"title":3553,"path":3554,"stem":3555,"children":3556,"page":59},"Ai Development","\u002Fai-development","14.ai-development",[3557],{"title":3558,"path":3559,"stem":3560,"children":3561,"page":59},"Foundations","\u002Fai-development\u002Ffoundations","14.ai-development\u002F00.foundations",[3562],{"title":3563,"path":3564,"stem":3565},"Модуль 0.1. Що таке Large Language Model (LLM)","\u002Fai-development\u002Ffoundations\u002Fwhat-is-llm","14.ai-development\u002F00.foundations\u002F01.what-is-llm",{"title":3567,"path":3568,"stem":3569,"children":3570,"page":59},"React Native","\u002Freact-native","15.react-native",[3571,3592],{"title":3572,"path":3573,"stem":3574,"children":3575,"page":59},"Version1","\u002Freact-native\u002Fversion1","15.react-native\u002Fversion1",[3576,3580,3584,3588],{"title":3577,"path":3578,"stem":3579},"Що таке React Native","\u002Freact-native\u002Fversion1\u002Fwhat-is-react-native","15.react-native\u002Fversion1\u002F01.what-is-react-native",{"title":3581,"path":3582,"stem":3583},"Як влаштований React Native «під капотом»","\u002Freact-native\u002Fversion1\u002Freact-native-architecture","15.react-native\u002Fversion1\u002F02.react-native-architecture",{"title":3585,"path":3586,"stem":3587},"Від React до React Native: ключові відмінності","\u002Freact-native\u002Fversion1\u002Freact-native-vs-react","15.react-native\u002Fversion1\u002F03.react-native-vs-react",{"title":3589,"path":3590,"stem":3591},"View та Text — фундаментальні будівельні блоки","\u002Freact-native\u002Fversion1\u002Fview-and-text","15.react-native\u002Fversion1\u002F04.view-and-text",{"title":3593,"path":3594,"stem":3595,"children":3596,"page":59},"Version2","\u002Freact-native\u002Fversion2","15.react-native\u002Fversion2",[3597,3601,3605,3609,3613,3617,3621,3625,3629,3633,3637,3641,3645,3649,3653,3657,3661,3665,3669,3673,3677,3681,3685,3689,3693,3697,3701],{"title":3598,"path":3599,"stem":3600},"React Native — навіщо він потрібен","\u002Freact-native\u002Fversion2\u002Fwhy-react-native","15.react-native\u002Fversion2\u002F01.why-react-native",{"title":3602,"path":3603,"stem":3604},"Налаштування середовища розробки","\u002Freact-native\u002Fversion2\u002Fenvironment-setup","15.react-native\u002Fversion2\u002F02.environment-setup",{"title":3606,"path":3607,"stem":3608},"Expo і класичний React Native — два шляхи одного фреймворку","\u002Freact-native\u002Fversion2\u002Fexpo-vs-cli-landscape","15.react-native\u002Fversion2\u002F03.expo-vs-cli-landscape",{"title":3610,"path":3611,"stem":3612},"Середовище Expo — перший запуск","\u002Freact-native\u002Fversion2\u002Fexpo-setup-and-tooling","15.react-native\u002Fversion2\u002F04.expo-setup-and-tooling",{"title":3614,"path":3615,"stem":3616},"Структура проєкту та перші UI-примітиви","\u002Freact-native\u002Fversion2\u002Fproject-structure-and-conventions","15.react-native\u002Fversion2\u002F05.project-structure-and-conventions",{"title":3618,"path":3619,"stem":3620},"Базові компоненти React Native","\u002Freact-native\u002Fversion2\u002Fcore-components","15.react-native\u002Fversion2\u002F06.core-components",{"title":3622,"path":3623,"stem":3624},"Flexbox і layout у React Native","\u002Freact-native\u002Fversion2\u002Fflexbox-and-layout","15.react-native\u002Fversion2\u002F07.flexbox-and-layout",{"title":3626,"path":3627,"stem":3628},"StyleSheet і теми (light \u002F dark)","\u002Freact-native\u002Fversion2\u002Fstylesheet-and-theming","15.react-native\u002Fversion2\u002F08.stylesheet-and-theming",{"title":3630,"path":3631,"stem":3632},"Списки та віртуалізація","\u002Freact-native\u002Fversion2\u002Flists-and-virtualization","15.react-native\u002Fversion2\u002F09.lists-and-virtualization",{"title":3634,"path":3635,"stem":3636},"Форми, ввід і валідація","\u002Freact-native\u002Fversion2\u002Fforms-input-validation","15.react-native\u002Fversion2\u002F10.forms-input-validation",{"title":3638,"path":3639,"stem":3640},"Основи Expo Router","\u002Freact-native\u002Fversion2\u002Fexpo-router-basics","15.react-native\u002Fversion2\u002F11.expo-router-basics",{"title":3642,"path":3643,"stem":3644},"Вкладені навігатори та модалки","\u002Freact-native\u002Fversion2\u002Fnested-navigators-and-modals","15.react-native\u002Fversion2\u002F12.nested-navigators-and-modals",{"title":3646,"path":3647,"stem":3648},"Deep linking і параметри маршрутів","\u002Freact-native\u002Fversion2\u002Fdeep-linking-and-params","15.react-native\u002Fversion2\u002F13.deep-linking-and-params",{"title":3650,"path":3651,"stem":3652},"Робота з мережею та життєвий цикл застосунку","\u002Freact-native\u002Fversion2\u002Fnetworking-and-app-lifecycle","15.react-native\u002Fversion2\u002F14.networking-and-app-lifecycle",{"title":3654,"path":3655,"stem":3656},"Redux Toolkit на мобільних платформах","\u002Freact-native\u002Fversion2\u002Fredux-toolkit-on-mobile","15.react-native\u002Fversion2\u002F15.redux-toolkit-on-mobile",{"title":3658,"path":3659,"stem":3660},"RTK Query на мобільних платформах","\u002Freact-native\u002Fversion2\u002Frtk-query-mobile","15.react-native\u002Fversion2\u002F16.rtk-query-mobile",{"title":3662,"path":3663,"stem":3664},"Автентифікація та Безпечне Зберігання","\u002Freact-native\u002Fversion2\u002Fauth-secure-storage","15.react-native\u002Fversion2\u002F18.auth-secure-storage",{"title":3666,"path":3667,"stem":3668},"Локальне сховище — AsyncStorage, MMKV, SQLite","\u002Freact-native\u002Fversion2\u002Flocal-storage-mmkv-sqlite","15.react-native\u002Fversion2\u002F19.local-storage-mmkv-sqlite",{"title":3670,"path":3671,"stem":3672},"Офлайн-First і синхронізація","\u002Freact-native\u002Fversion2\u002Foffline-first-sync","15.react-native\u002Fversion2\u002F20.offline-first-sync",{"title":3674,"path":3675,"stem":3676},"Камера, медіа та файлова система","\u002Freact-native\u002Fversion2\u002Fcamera-media-filesystem","15.react-native\u002Fversion2\u002F21.camera-media-filesystem",{"title":3678,"path":3679,"stem":3680},"Карти та геолокація","\u002Freact-native\u002Fversion2\u002Fmaps-and-location","15.react-native\u002Fversion2\u002F22.maps-and-location",{"title":3682,"path":3683,"stem":3684},"Жести та дотики","\u002Freact-native\u002Fversion2\u002Fgestures-and-touch","15.react-native\u002Fversion2\u002F23.gestures-and-touch",{"title":3686,"path":3687,"stem":3688},"Анімації з Reanimated","\u002Freact-native\u002Fversion2\u002Freanimated-animations","15.react-native\u002Fversion2\u002F24.reanimated-animations",{"title":3690,"path":3691,"stem":3692},"Push і локальні сповіщення","\u002Freact-native\u002Fversion2\u002Fpush-and-local-notifications","15.react-native\u002Fversion2\u002F25.push-and-local-notifications",{"title":3694,"path":3695,"stem":3696},"Інтернаціоналізація та доступність","\u002Freact-native\u002Fversion2\u002Faccessibility-and-i18n","15.react-native\u002Fversion2\u002F26.accessibility-and-i18n",{"title":3698,"path":3699,"stem":3700},"EAS Build та профілі збірки","\u002Freact-native\u002Fversion2\u002Feas-build-and-profiles","15.react-native\u002Fversion2\u002F29.eas-build-and-profiles",{"title":3702,"path":3703,"stem":3704},"Публікація в App Store та Google Play","\u002Freact-native\u002Fversion2\u002Fapp-store-play-release","15.react-native\u002Fversion2\u002F30.app-store-play-release",{"title":3706,"path":3707,"stem":3708,"children":3709,"page":59},"Ai Python","\u002Fai-python","16.ai-python",[3710,3719,3728,3737,3766,3792,3817,3850,3867,3880,3889,3902,3911,3932,3945,3966],{"title":3711,"path":3712,"stem":3713,"children":3714,"page":59},"Intro To Ai","\u002Fai-python\u002Fintro-to-ai","16.ai-python\u002F01.intro-to-ai",[3715],{"title":3716,"path":3717,"stem":3718},"Вступ до штучного інтелекту та машинного навчання","\u002Fai-python\u002Fintro-to-ai\u002Fintro-to-ai","16.ai-python\u002F01.intro-to-ai\u002F01.intro-to-ai",{"title":3720,"path":3721,"stem":3722,"children":3723,"page":59},"Jupyter Notebook","\u002Fai-python\u002Fjupyter-notebook","16.ai-python\u002F02.jupyter-notebook",[3724],{"title":3725,"path":3726,"stem":3727},"Знайомство з Jupyter Notebook та JupyterLab","\u002Fai-python\u002Fjupyter-notebook\u002Fjupyter-notebook","16.ai-python\u002F02.jupyter-notebook\u002F02.jupyter-notebook",{"title":3729,"path":3730,"stem":3731,"children":3732,"page":59},"Numpy Pandas","\u002Fai-python\u002Fnumpy-pandas","16.ai-python\u002F03.numpy-pandas",[3733],{"title":3734,"path":3735,"stem":3736},"Робота з даними з використанням NumPy і pandas","\u002Fai-python\u002Fnumpy-pandas\u002Fnumpy-pandas","16.ai-python\u002F03.numpy-pandas\u002F03.numpy-pandas",{"title":3738,"path":3739,"stem":3740,"children":3741,"page":59},"Statistics Basics","\u002Fai-python\u002Fstatistics-basics","16.ai-python\u002F04.statistics-basics",[3742,3746,3750,3754,3758,3762],{"title":3743,"path":3744,"stem":3745},"Випадкові величини та їх типи","\u002Fai-python\u002Fstatistics-basics\u002Frandom-variables","16.ai-python\u002F04.statistics-basics\u002F01.random-variables",{"title":3747,"path":3748,"stem":3749},"Міри центральної тенденції","\u002Fai-python\u002Fstatistics-basics\u002Fcentral-tendency","16.ai-python\u002F04.statistics-basics\u002F02.central-tendency",{"title":3751,"path":3752,"stem":3753},"Міри варіації (розсіювання)","\u002Fai-python\u002Fstatistics-basics\u002Fvariability","16.ai-python\u002F04.statistics-basics\u002F03.variability",{"title":3755,"path":3756,"stem":3757},"Розподіли випадкових величин","\u002Fai-python\u002Fstatistics-basics\u002Fdistributions","16.ai-python\u002F04.statistics-basics\u002F04.distributions",{"title":3759,"path":3760,"stem":3761},"Кореляція та взаємозв'язки","\u002Fai-python\u002Fstatistics-basics\u002Fcorrelation","16.ai-python\u002F04.statistics-basics\u002F05.correlation",{"title":3763,"path":3764,"stem":3765},"Викиди та аномалії","\u002Fai-python\u002Fstatistics-basics\u002Foutliers","16.ai-python\u002F04.statistics-basics\u002F06.outliers",{"title":3767,"path":3768,"stem":3769,"children":3770},"Візуалізація даних за допомогою matplotlib","\u002Fai-python\u002Fdata-visualization","16.ai-python\u002F05.data-visualization\u002Findex",[3771,3772,3776,3780,3784,3788],{"title":3767,"path":3768,"stem":3769},{"title":3773,"path":3774,"stem":3775},"Основи matplotlib — Figure, Axes та перший графік","\u002Fai-python\u002Fdata-visualization\u002Fmatplotlib-basics","16.ai-python\u002F05.data-visualization\u002F01.matplotlib-basics",{"title":3777,"path":3778,"stem":3779},"Візуалізація розподілів — гістограми та box plots","\u002Fai-python\u002Fdata-visualization\u002Fdistributions","16.ai-python\u002F05.data-visualization\u002F02.distributions",{"title":3781,"path":3782,"stem":3783},"Візуалізація залежностей — scatter plots та кореляція","\u002Fai-python\u002Fdata-visualization\u002Frelationships","16.ai-python\u002F05.data-visualization\u002F03.relationships",{"title":3785,"path":3786,"stem":3787},"Візуалізація категоріальних даних — bar charts та pie charts","\u002Fai-python\u002Fdata-visualization\u002Fcategorical","16.ai-python\u002F05.data-visualization\u002F04.categorical",{"title":3789,"path":3790,"stem":3791},"Композиції та стилізація — subplots та багатопанельні дашборди","\u002Fai-python\u002Fdata-visualization\u002Fsubplots-styling","16.ai-python\u002F05.data-visualization\u002F05.subplots-styling",{"title":3793,"path":3794,"stem":3795,"children":3796,"page":59},"Linear Regression","\u002Fai-python\u002Flinear-regression","16.ai-python\u002F06.linear-regression",[3797,3801,3805,3809,3813],{"title":3798,"path":3799,"stem":3800},"Регресійна задача та лінійна регресія з однією змінною","\u002Fai-python\u002Flinear-regression\u002Fregression-task","16.ai-python\u002F06.linear-regression\u002F01.regression-task",{"title":3802,"path":3803,"stem":3804},"Метрики якості регресії — як оцінити модель","\u002Fai-python\u002Flinear-regression\u002Fquality-metrics","16.ai-python\u002F06.linear-regression\u002F02.quality-metrics",{"title":3806,"path":3807,"stem":3808},"Градієнтний спуск — як модель навчається","\u002Fai-python\u002Flinear-regression\u002Fgradient-descent","16.ai-python\u002F06.linear-regression\u002F03.gradient-descent",{"title":3810,"path":3811,"stem":3812},"Множинна лінійна регресія — модель з багатьма ознаками","\u002Fai-python\u002Flinear-regression\u002Fmultiple-regression","16.ai-python\u002F06.linear-regression\u002F04.multiple-regression",{"title":3814,"path":3815,"stem":3816},"Практичні завдання та резюме модуля","\u002Fai-python\u002Flinear-regression\u002Fpractice","16.ai-python\u002F06.linear-regression\u002F05.practice",{"title":3818,"path":3819,"stem":3820,"children":3821,"page":59},"Practical Regression","\u002Fai-python\u002Fpractical-regression","16.ai-python\u002F07.practical-regression",[3822,3826,3830,3834,3838,3842,3846],{"title":3823,"path":3824,"stem":3825},"Знайомство з scikit-learn","\u002Fai-python\u002Fpractical-regression\u002Fintro-scikit-learn","16.ai-python\u002F07.practical-regression\u002F01.intro-scikit-learn",{"title":3827,"path":3828,"stem":3829},"Exploratory Data Analysis датасету Housing Prices","\u002Fai-python\u002Fpractical-regression\u002Fhousing-dataset-eda","16.ai-python\u002F07.practical-regression\u002F02.housing-dataset-eda",{"title":3831,"path":3832,"stem":3833},"Попередня обробка даних (Data Preprocessing)","\u002Fai-python\u002Fpractical-regression\u002Fdata-preprocessing","16.ai-python\u002F07.practical-regression\u002F03.data-preprocessing",{"title":3835,"path":3836,"stem":3837},"Train\u002FTest Split та перша повноцінна модель","\u002Fai-python\u002Fpractical-regression\u002Ftrain-test-split","16.ai-python\u002F07.practical-regression\u002F04.train-test-split",{"title":3839,"path":3840,"stem":3841},"Перенавчання та недонавчання","\u002Fai-python\u002Fpractical-regression\u002Foverfitting-underfitting","16.ai-python\u002F07.practical-regression\u002F05.overfitting-underfitting",{"title":3843,"path":3844,"stem":3845},"Крос-валідація (Cross-Validation)","\u002Fai-python\u002Fpractical-regression\u002Fcross-validation","16.ai-python\u002F07.practical-regression\u002F06.cross-validation",{"title":3847,"path":3848,"stem":3849},"Гіперпараметри та їх оптимізація","\u002Fai-python\u002Fpractical-regression\u002Fhyperparameter-tuning","16.ai-python\u002F07.practical-regression\u002F07.hyperparameter-tuning",{"title":3851,"path":3852,"stem":3853,"children":3854,"page":59},"Polynomial Regression","\u002Fai-python\u002Fpolynomial-regression","16.ai-python\u002F08.polynomial-regression",[3855,3859,3863],{"title":3856,"path":3857,"stem":3858},"Нелінійні залежності та поліноміальна регресія","\u002Fai-python\u002Fpolynomial-regression\u002Fnonlinear-patterns","16.ai-python\u002F08.polynomial-regression\u002F01.nonlinear-patterns",{"title":3860,"path":3861,"stem":3862},"Регуляризація в регресії — Ridge та Lasso","\u002Fai-python\u002Fpolynomial-regression\u002Fregularization-methods","16.ai-python\u002F08.polynomial-regression\u002F02.regularization-methods",{"title":3864,"path":3865,"stem":3866},"Практика — поліноміальна регресія та регуляризація на Housing Prices","\u002Fai-python\u002Fpolynomial-regression\u002Fhousing-prices-practice","16.ai-python\u002F08.polynomial-regression\u002F03.housing-prices-practice",{"title":3868,"path":3869,"stem":3870,"children":3871,"page":59},"Decision Trees Random Forest","\u002Fai-python\u002Fdecision-trees-random-forest","16.ai-python\u002F09.decision-trees-random-forest",[3872,3876],{"title":3873,"path":3874,"stem":3875},"Дерева рішень — моделі з прозорою та зрозумілою логікою","\u002Fai-python\u002Fdecision-trees-random-forest\u002Fdecision-trees","16.ai-python\u002F09.decision-trees-random-forest\u002F01.decision-trees",{"title":3877,"path":3878,"stem":3879},"Random Forest — ансамблі дерев рішень","\u002Fai-python\u002Fdecision-trees-random-forest\u002Frandom-forest","16.ai-python\u002F09.decision-trees-random-forest\u002F02.random-forest",{"title":3881,"path":3882,"stem":3883,"children":3884,"page":59},"Gradient Boosting","\u002Fai-python\u002Fgradient-boosting","16.ai-python\u002F10.gradient-boosting",[3885],{"title":3886,"path":3887,"stem":3888},"Градієнтний бустинг та XGBoost — послідовне виправлення помилок","\u002Fai-python\u002Fgradient-boosting\u002Fgradient-boosting-xgboost","16.ai-python\u002F10.gradient-boosting\u002F01.gradient-boosting-xgboost",{"title":3890,"path":3891,"stem":3892,"children":3893,"page":59},"Logistic Regression Classification","\u002Fai-python\u002Flogistic-regression-classification","16.ai-python\u002F11.logistic-regression-classification",[3894,3898],{"title":3895,"path":3896,"stem":3897},"Основи класифікації та логістична регресія","\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-basics","16.ai-python\u002F11.logistic-regression-classification\u002F01.classification-basics",{"title":3899,"path":3900,"stem":3901},"Метрики якості класифікації","\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics","16.ai-python\u002F11.logistic-regression-classification\u002F02.classification-metrics",{"title":3903,"path":3904,"stem":3905,"children":3906,"page":59},"Neural Networks Basics","\u002Fai-python\u002Fneural-networks-basics","16.ai-python\u002F12.neural-networks-basics",[3907],{"title":3908,"path":3909,"stem":3910},"Вступ до нейронних мереж — від персептрона до багатошарових мереж","\u002Fai-python\u002Fneural-networks-basics\u002Fperceptron-to-mlp","16.ai-python\u002F12.neural-networks-basics\u002F01.perceptron-to-mlp",{"title":3912,"path":3913,"stem":3914,"children":3915,"page":59},"Pytorch Intro","\u002Fai-python\u002Fpytorch-intro","16.ai-python\u002F13.pytorch-intro",[3916,3920,3924,3928],{"title":3917,"path":3918,"stem":3919},"Тензори та автоматичне диференціювання в PyTorch","\u002Fai-python\u002Fpytorch-intro\u002Ftensors-and-autograd","16.ai-python\u002F13.pytorch-intro\u002F01.tensors-and-autograd",{"title":3921,"path":3922,"stem":3923},"Побудова та тренування нейронних мереж у PyTorch","\u002Fai-python\u002Fpytorch-intro\u002Fbuilding-and-training","16.ai-python\u002F13.pytorch-intro\u002F02.building-and-training",{"title":3925,"path":3926,"stem":3927},"Робота з даними та регуляризація в PyTorch","\u002Fai-python\u002Fpytorch-intro\u002Fdata-and-regularization","16.ai-python\u002F13.pytorch-intro\u002F03.data-and-regularization",{"title":3929,"path":3930,"stem":3931},"Просунуті теми PyTorch — GPU, оптимізація та deployment","\u002Fai-python\u002Fpytorch-intro\u002Fadvanced-topics","16.ai-python\u002F13.pytorch-intro\u002F04.advanced-topics",{"title":3933,"path":3934,"stem":3935,"children":3936,"page":59},"Activation Functions Heart Disease","\u002Fai-python\u002Factivation-functions-heart-disease","16.ai-python\u002F14.activation-functions-heart-disease",[3937,3941],{"title":3938,"path":3939,"stem":3940},"Функції активації та побудова нейронної мережі для передбачення вад серця","\u002Fai-python\u002Factivation-functions-heart-disease\u002Fheart-disease-prediction","16.ai-python\u002F14.activation-functions-heart-disease\u002F01.heart-disease-prediction",{"title":3942,"path":3943,"stem":3944},"Бонус — Повний приклад Student Performance Prediction","\u002Fai-python\u002Factivation-functions-heart-disease\u002Fstudent-performance-bonus","16.ai-python\u002F14.activation-functions-heart-disease\u002F02.student-performance-bonus",{"title":3946,"path":3947,"stem":3948,"children":3949,"page":59},"Cnn Image Classification","\u002Fai-python\u002Fcnn-image-classification","16.ai-python\u002F15.cnn-image-classification",[3950,3954,3958,3962],{"title":3951,"path":3952,"stem":3953},"Основи згорткових нейронних мереж — чому не MLP?","\u002Fai-python\u002Fcnn-image-classification\u002Fcnn-fundamentals","16.ai-python\u002F15.cnn-image-classification\u002F01.cnn-fundamentals",{"title":3955,"path":3956,"stem":3957},"Практична імплементація CNN для класифікації MNIST","\u002Fai-python\u002Fcnn-image-classification\u002Fmnist-classification","16.ai-python\u002F15.cnn-image-classification\u002F02.mnist-classification",{"title":3959,"path":3960,"stem":3961},"Глибші CNN та аугментація даних для CIFAR-10","\u002Fai-python\u002Fcnn-image-classification\u002Fcifar10-and-data-augmentation","16.ai-python\u002F15.cnn-image-classification\u002F03.cifar10-and-data-augmentation",{"title":3963,"path":3964,"stem":3965},"Transfer Learning та візуалізація внутрішніх представлень CNN","\u002Fai-python\u002Fcnn-image-classification\u002Ftransfer-learning-and-visualization","16.ai-python\u002F15.cnn-image-classification\u002F04.transfer-learning-and-visualization",{"title":3967,"path":3968,"stem":3969,"children":3970,"page":59},"Batching Normalization Deep Networks","\u002Fai-python\u002Fbatching-normalization-deep-networks","16.ai-python\u002F16.batching-normalization-deep-networks",[3971,3975,3979,3983,3987,3991,3995],{"title":3972,"path":3973,"stem":3974},"Mini-batch Gradient Descent та ефективна обробка даних","\u002Fai-python\u002Fbatching-normalization-deep-networks\u002Fmini-batch-gradient-descent","16.ai-python\u002F16.batching-normalization-deep-networks\u002F01.mini-batch-gradient-descent",{"title":3976,"path":3977,"stem":3978},"Ініціалізація ваг — фундамент стабільного навчання","\u002Fai-python\u002Fbatching-normalization-deep-networks\u002Fweight-initialization","16.ai-python\u002F16.batching-normalization-deep-networks\u002F02.weight-initialization",{"title":3980,"path":3981,"stem":3982},"Batch Normalization — прорив у глибокому навчанні","\u002Fai-python\u002Fbatching-normalization-deep-networks\u002Fbatch-normalization","16.ai-python\u002F16.batching-normalization-deep-networks\u002F03.batch-normalization",{"title":3984,"path":3985,"stem":3986},"Dropout та комбіновані стратегії регуляризації","\u002Fai-python\u002Fbatching-normalization-deep-networks\u002Fdropout-and-regularization","16.ai-python\u002F16.batching-normalization-deep-networks\u002F04.dropout-and-regularization",{"title":3988,"path":3989,"stem":3990},"Проєктування глибоких мереж — від теорії до практики","\u002Fai-python\u002Fbatching-normalization-deep-networks\u002Fdeep-networks-architectures","16.ai-python\u002F16.batching-normalization-deep-networks\u002F05.deep-networks-architectures",{"title":3992,"path":3993,"stem":3994},"Планування learning rate — коли та як зменшувати крок навчання","\u002Fai-python\u002Fbatching-normalization-deep-networks\u002Flearning-rate-scheduling","16.ai-python\u002F16.batching-normalization-deep-networks\u002F06.learning-rate-scheduling",{"title":3996,"path":3997,"stem":3998},"Підсумковий проєкт — побудова сучасного класифікатора зображень","\u002Fai-python\u002Fbatching-normalization-deep-networks\u002Ffinal-project-deep-classifier","16.ai-python\u002F16.batching-normalization-deep-networks\u002F07.final-project-deep-classifier",{"title":4000,"icon":658,"path":4001,"stem":4002,"children":4003,"page":59},"Клієнт-серверна архітектура","\u002Fclient-server-architecture","17.client-server-architecture",[4004,4008,4012,4016,4020,4024,4028,4032,4036,4040,4044,4048,4052,4056,4060,4064,4068,4072],{"title":4005,"path":4006,"stem":4007},"Архітектура клієнт-серверних систем та основи Go","\u002Fclient-server-architecture\u002Fclient-server-architecture-and-go","17.client-server-architecture\u002F01.client-server-architecture-and-go",{"title":4009,"path":4010,"stem":4011},"Система типів та модель пам’яті мови Go","\u002Fclient-server-architecture\u002Ftype-system-and-memory-model","17.client-server-architecture\u002F02.type-system-and-memory-model",{"title":4013,"path":4014,"stem":4015},"Інтерфейси та модель конкурентності мови Go","\u002Fclient-server-architecture\u002Finterfaces-and-concurrency-model","17.client-server-architecture\u002F03.interfaces-and-concurrency-model",{"title":4017,"path":4018,"stem":4019},"Сокетне програмування та протокол TCP у Go","\u002Fclient-server-architecture\u002Ftcp-socket-programming","17.client-server-architecture\u002F04.tcp-socket-programming",{"title":4021,"path":4022,"stem":4023},"Протокол UDP та датаграмна передача даних","\u002Fclient-server-architecture\u002Fudp-datagram-transmission","17.client-server-architecture\u002F05.udp-datagram-transmission",{"title":4025,"path":4026,"stem":4027},"Криптографічний захист каналів зв","\u002Fclient-server-architecture\u002Ftls-cryptographic-channel-protection","17.client-server-architecture\u002F06.tls-cryptographic-channel-protection",{"title":4029,"path":4030,"stem":4031},"Прикладні мережеві протоколи DNS та SMTP","\u002Fclient-server-architecture\u002Fdns-smtp-application-protocols","17.client-server-architecture\u002F07.dns-smtp-application-protocols",{"title":4033,"path":4034,"stem":4035},"Протокол HTTP та стандартний вебсервер Go","\u002Fclient-server-architecture\u002Fhttp-protocol-and-web-server","17.client-server-architecture\u002F08.http-protocol-and-web-server",{"title":4037,"path":4038,"stem":4039},"Проєктування REST API та маршрутизація засобами Chi","\u002Fclient-server-architecture\u002Frest-api-design-and-chi-routing","17.client-server-architecture\u002F09.rest-api-design-and-chi-routing",{"title":4041,"path":4042,"stem":4043},"Лекція 10. Шарувата архітектура та конвеєри обробки запитів","\u002Fclient-server-architecture\u002Flayered-architecture-and-middleware-pipelines","17.client-server-architecture\u002F10.layered-architecture-and-middleware-pipelines",{"title":4045,"path":4046,"stem":4047},"Лекція 11. Архітектура та маршрутизація фреймворку Gin","\u002Fclient-server-architecture\u002Fgin-framework-architecture-and-routing","17.client-server-architecture\u002F11.gin-framework-architecture-and-routing",{"title":4049,"path":4050,"stem":4051},"Лекція 12. Валідація даних, безпека та документування у Gin","\u002Fclient-server-architecture\u002Fdata-validation-security-and-documentation-in-gin","17.client-server-architecture\u002F12.data-validation-security-and-documentation-in-gin",{"title":4053,"path":4054,"stem":4055},"Лекція 13. Взаємодія з реляційними СУБД та технології ORM","\u002Fclient-server-architecture\u002Frelational-databases-and-orm","17.client-server-architecture\u002F13.relational-databases-and-orm",{"title":4057,"path":4058,"stem":4059},"Потокова передача даних та протокол WebSocket","\u002Fclient-server-architecture\u002Fstreaming-data-and-websockets","17.client-server-architecture\u002F14.streaming-data-and-websockets",{"title":4061,"path":4062,"stem":4063},"Міжсервісна взаємодія на основі протоколу gRPC","\u002Fclient-server-architecture\u002Fgrpc-inter-service-communication","17.client-server-architecture\u002F15.grpc-inter-service-communication",{"title":4065,"path":4066,"stem":4067},"Асинхронний обмін повідомленнями та протоколи черг","\u002Fclient-server-architecture\u002Fasynchronous-message-exchange-and-queue-protocols","17.client-server-architecture\u002F16.asynchronous-message-exchange-and-queue-protocols",{"title":4069,"path":4070,"stem":4071},"Протоколи потокового медіа та технологія WebRTC","\u002Fclient-server-architecture\u002Fstreaming-media-protocols-and-webrtc","17.client-server-architecture\u002F17.streaming-media-protocols-and-webrtc",{"title":4073,"path":4074,"stem":4075},"Моніторинг, безпека та контейнеризація застосунків","\u002Fclient-server-architecture\u002Fmonitoring-security-and-containerization","17.client-server-architecture\u002F18.monitoring-security-and-containerization",{"title":4077,"icon":2134,"path":4078,"stem":4079,"children":4080,"page":59},"Розробка WEB-застосувань","\u002Fweb-development","18.web-development",[4081,4126,4164,4193,4222,4279,4329,4423,4489,4571,4604,4632,4674,4720,4763],{"title":4082,"icon":658,"path":4083,"stem":4084,"children":4085,"page":59},"Архітектура комп'ютерних мереж та мережеві протоколи","\u002Fweb-development\u002Fnetwork-architecture-and-protocols","18.web-development\u002F01.network-architecture-and-protocols",[4086,4090,4094,4098,4102,4106,4110,4114,4118,4122],{"title":4087,"path":4088,"stem":4089},"Еволюція веброзробки та модель клієнт-сервер","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fweb-evolution-client-server","18.web-development\u002F01.network-architecture-and-protocols\u002F01.web-evolution-client-server",{"title":4091,"path":4092,"stem":4093},"Еталонна модель OSI","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fosi-model","18.web-development\u002F01.network-architecture-and-protocols\u002F02.osi-model",{"title":4095,"path":4096,"stem":4097},"Стек протоколів TCP\u002FIP","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Ftcp-ip-stack","18.web-development\u002F01.network-architecture-and-protocols\u002F03.tcp-ip-stack",{"title":4099,"path":4100,"stem":4101},"IP-адресація, порти та сокети","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fip-addressing-ports-sockets","18.web-development\u002F01.network-architecture-and-protocols\u002F04.ip-addressing-ports-sockets",{"title":4103,"path":4104,"stem":4105},"Протоколи TCP та UDP","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Ftcp-udp-protocols","18.web-development\u002F01.network-architecture-and-protocols\u002F05.tcp-udp-protocols",{"title":4107,"path":4108,"stem":4109},"Система доменних імен DNS","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fdns-system","18.web-development\u002F01.network-architecture-and-protocols\u002F06.dns-system",{"title":4111,"path":4112,"stem":4113},"Протокол SMTP та поштові протоколи","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fsmtp-email-protocols","18.web-development\u002F01.network-architecture-and-protocols\u002F07.smtp-email-protocols",{"title":4115,"path":4116,"stem":4117},"Протокол WebSocket","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fwebsocket-protocol","18.web-development\u002F01.network-architecture-and-protocols\u002F08.websocket-protocol",{"title":4119,"path":4120,"stem":4121},"Протокол SSH","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fssh-protocol","18.web-development\u002F01.network-architecture-and-protocols\u002F09.ssh-protocol",{"title":4123,"path":4124,"stem":4125},"Огляд сучасних серверних технологій","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fmodern-backend-technologies","18.web-development\u002F01.network-architecture-and-protocols\u002F10.modern-backend-technologies",{"title":4127,"icon":4128,"path":4129,"stem":4130,"children":4131,"page":59},"Протокол HTTP та захищена передача даних HTTPS","i-lucide-lock","\u002Fweb-development\u002Fhttp-and-https","18.web-development\u002F02.http-and-https",[4132,4136,4140,4144,4148,4152,4156,4160],{"title":4133,"path":4134,"stem":4135},"Вступ до протоколу HTTP та еволюція веб-технологій","\u002Fweb-development\u002Fhttp-and-https\u002Fintroduction-and-evolution","18.web-development\u002F02.http-and-https\u002F01.introduction-and-evolution",{"title":4137,"path":4138,"stem":4139},"Анатомія HTTP-запиту","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-request-structure","18.web-development\u002F02.http-and-https\u002F02.http-request-structure",{"title":4141,"path":4142,"stem":4143},"Анатомія HTTP-відповіді","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-response-structure","18.web-development\u002F02.http-and-https\u002F03.http-response-structure",{"title":4145,"path":4146,"stem":4147},"Методи HTTP та їхня семантика","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-methods","18.web-development\u002F02.http-and-https\u002F04.http-methods",{"title":4149,"path":4150,"stem":4151},"Коди статусу HTTP та їхнє призначення","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-status-codes","18.web-development\u002F02.http-and-https\u002F05.http-status-codes",{"title":4153,"path":4154,"stem":4155},"HTTP-заголовки та їхнє призначення","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-headers","18.web-development\u002F02.http-and-https\u002F06.http-headers",{"title":4157,"path":4158,"stem":4159},"CORS та механізми безпеки HTTP","\u002Fweb-development\u002Fhttp-and-https\u002Fcors-and-security","18.web-development\u002F02.http-and-https\u002F07.cors-and-security",{"title":4161,"path":4162,"stem":4163},"HTTPS та криптографічні основи TLS","\u002Fweb-development\u002Fhttp-and-https\u002Fhttps-and-tls","18.web-development\u002F02.http-and-https\u002F08.https-and-tls",{"title":4165,"icon":2514,"path":4166,"stem":4167,"children":4168,"page":59},"Система типів мови TypeScript","\u002Fweb-development\u002Ftypescript-type-system","18.web-development\u002F03.typescript-type-system",[4169,4173,4177,4181,4185,4189],{"title":4170,"path":4171,"stem":4172},"Знайомство з TypeScript Compiler","\u002Fweb-development\u002Ftypescript-type-system\u002Fintroduction-compiler-config","18.web-development\u002F03.typescript-type-system\u002F01.introduction-compiler-config",{"title":4174,"path":4175,"stem":4176},"Примітивні типи даних: string, number, boolean","\u002Fweb-development\u002Ftypescript-type-system\u002Fprimitive-special-types","18.web-development\u002F03.typescript-type-system\u002F02.primitive-special-types",{"title":4178,"path":4179,"stem":4180},"Масиви, кортежі та об","\u002Fweb-development\u002Ftypescript-type-system\u002Farrays-tuples-objects","18.web-development\u002F03.typescript-type-system\u002F03.arrays-tuples-objects",{"title":4182,"path":4183,"stem":4184},"Псевдоніми типів, Union типи, Intersection типи та літеральні типи","\u002Fweb-development\u002Ftypescript-type-system\u002Funion-intersection-literals","18.web-development\u002F03.typescript-type-system\u002F04.union-intersection-literals",{"title":4186,"path":4187,"stem":4188},"Type Narrowing (звуження типів)","\u002Fweb-development\u002Ftypescript-type-system\u002Ftype-narrowing","18.web-development\u002F03.typescript-type-system\u002F05.type-narrowing",{"title":4190,"path":4191,"stem":4192},"Типізація функцій","\u002Fweb-development\u002Ftypescript-type-system\u002Ffunctions-typing","18.web-development\u002F03.typescript-type-system\u002F06.functions-typing",{"title":4194,"icon":2514,"path":4195,"stem":4196,"children":4197,"page":59},"Розширені засоби мови TypeScript","\u002Fweb-development\u002Ftypescript-advanced","18.web-development\u002F04.typescript-advanced",[4198,4202,4206,4210,4214,4218],{"title":4199,"path":4200,"stem":4201},"Interfaces та Classes","\u002Fweb-development\u002Ftypescript-advanced\u002Finterfaces-classes","18.web-development\u002F04.typescript-advanced\u002F01.interfaces-classes",{"title":4203,"path":4204,"stem":4205},"Основи Generic типів","\u002Fweb-development\u002Ftypescript-advanced\u002Fgenerics-fundamentals","18.web-development\u002F04.typescript-advanced\u002F02.generics-fundamentals",{"title":4207,"path":4208,"stem":4209},"Enums та Decorators","\u002Fweb-development\u002Ftypescript-advanced\u002Fenums-decorators","18.web-development\u002F04.typescript-advanced\u002F03.enums-decorators",{"title":4211,"path":4212,"stem":4213},"Utility Types","\u002Fweb-development\u002Ftypescript-advanced\u002Futility-types","18.web-development\u002F04.typescript-advanced\u002F04.utility-types",{"title":4215,"path":4216,"stem":4217},"Mapped та Conditional Types","\u002Fweb-development\u002Ftypescript-advanced\u002Fmapped-conditional-types","18.web-development\u002F04.typescript-advanced\u002F05.mapped-conditional-types",{"title":4219,"path":4220,"stem":4221},"Модулі та Strict Mode","\u002Fweb-development\u002Ftypescript-advanced\u002Fmodules-strict-mode","18.web-development\u002F04.typescript-advanced\u002F06.modules-strict-mode",{"title":4223,"icon":4224,"path":4225,"stem":4226,"children":4227,"page":59},"Платформа Node.js як середовище виконання","i-devicon-nodejs","\u002Fweb-development\u002Fnodejs-platform","18.web-development\u002F05.nodejs-platform",[4228,4232,4236,4240,4244,4248,4252,4256,4260,4264,4268,4271,4275],{"title":4229,"path":4230,"stem":4231},"Що таке Node.js та його архітектура","\u002Fweb-development\u002Fnodejs-platform\u002Fwhat-is-nodejs","18.web-development\u002F05.nodejs-platform\u002F01.what-is-nodejs",{"title":4233,"path":4234,"stem":4235},"Event Loop — серце Node.js","\u002Fweb-development\u002Fnodejs-platform\u002Fevent-loop","18.web-development\u002F05.nodejs-platform\u002F02.event-loop",{"title":4237,"path":4238,"stem":4239},"Модульні системи: CommonJS vs ES Modules","\u002Fweb-development\u002Fnodejs-platform\u002Fmodule-systems","18.web-development\u002F05.nodejs-platform\u002F03.module-systems",{"title":4241,"path":4242,"stem":4243},"npm та package.json","\u002Fweb-development\u002Fnodejs-platform\u002Fnpm-package-json","18.web-development\u002F05.nodejs-platform\u002F04.npm-package-json",{"title":4245,"path":4246,"stem":4247},"Глобальні об\\","\u002Fweb-development\u002Fnodejs-platform\u002Fglobal-objects","18.web-development\u002F05.nodejs-platform\u002F05.global-objects",{"title":4249,"path":4250,"stem":4251},"Вбудований модуль fs (File System)","\u002Fweb-development\u002Fnodejs-platform\u002Fbuilt-in-modules-fs","18.web-development\u002F05.nodejs-platform\u002F06.built-in-modules-fs",{"title":4253,"path":4254,"stem":4255},"Вбудований модуль path","\u002Fweb-development\u002Fnodejs-platform\u002Fbuilt-in-modules-path","18.web-development\u002F05.nodejs-platform\u002F07.built-in-modules-path",{"title":4257,"path":4258,"stem":4259},"Вбудований модуль http","\u002Fweb-development\u002Fnodejs-platform\u002Fbuilt-in-modules-http","18.web-development\u002F05.nodejs-platform\u002F08.built-in-modules-http",{"title":4261,"path":4262,"stem":4263},"Streams — потоки даних у Node.js","\u002Fweb-development\u002Fnodejs-platform\u002Fstreams","18.web-development\u002F05.nodejs-platform\u002F09.streams",{"title":4265,"path":4266,"stem":4267},"Вбудований модуль util (Utilities)","\u002Fweb-development\u002Fnodejs-platform\u002Fbuilt-in-modules-util","18.web-development\u002F05.nodejs-platform\u002F10.built-in-modules-util",{"title":3157,"path":4269,"stem":4270},"\u002Fweb-development\u002Fnodejs-platform\u002Fenvironment-variables","18.web-development\u002F05.nodejs-platform\u002F11.environment-variables",{"title":4272,"path":4273,"stem":4274},"Інструменти налагодження та розробки","\u002Fweb-development\u002Fnodejs-platform\u002Fdebugging-tools","18.web-development\u002F05.nodejs-platform\u002F12.debugging-tools",{"title":4276,"path":4277,"stem":4278},"Продуктивність та Best Practices","\u002Fweb-development\u002Fnodejs-platform\u002Fperformance-best-practices","18.web-development\u002F05.nodejs-platform\u002F13.performance-best-practices",{"title":4280,"icon":4281,"path":4282,"stem":4283,"children":4284,"page":59},"Асинхронне програмування у Node.js","i-lucide-clock","\u002Fweb-development\u002Fasync-programming-nodejs","18.web-development\u002F06.async-programming-nodejs",[4285,4289,4293,4297,4301,4305,4309,4313,4317,4321,4325],{"title":4286,"path":4287,"stem":4288},"Синхронний vs асинхронний код","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fsync-vs-async","18.web-development\u002F06.async-programming-nodejs\u002F01.sync-vs-async",{"title":4290,"path":4291,"stem":4292},"Callbacks — перша парадигма асинхронності","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fcallbacks","18.web-development\u002F06.async-programming-nodejs\u002F02.callbacks",{"title":4294,"path":4295,"stem":4296},"Promises — стандарт асинхронності","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fpromises","18.web-development\u002F06.async-programming-nodejs\u002F03.promises",{"title":4298,"path":4299,"stem":4300},"Promise комбінатори","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fpromise-combinators","18.web-development\u002F06.async-programming-nodejs\u002F04.promise-combinators",{"title":4302,"path":4303,"stem":4304},"Async\u002FAwait — синтаксичний цукор над Promises","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fasync-await","18.web-development\u002F06.async-programming-nodejs\u002F05.async-await",{"title":4306,"path":4307,"stem":4308},"Паралельне vs послідовне виконання","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fparallel-vs-sequential","18.web-development\u002F06.async-programming-nodejs\u002F06.parallel-vs-sequential",{"title":4310,"path":4311,"stem":4312},"EventEmitter — подієва модель Node.js","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fevent-emitter","18.web-development\u002F06.async-programming-nodejs\u002F07.event-emitter",{"title":4314,"path":4315,"stem":4316},"Worker Threads — багатопотоковість у Node.js","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fworker-threads","18.web-development\u002F06.async-programming-nodejs\u002F08.worker-threads",{"title":4318,"path":4319,"stem":4320},"Child Processes — запуск зовнішніх процесів","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fchild-processes","18.web-development\u002F06.async-programming-nodejs\u002F09.child-processes",{"title":4322,"path":4323,"stem":4324},"Обробка помилок у асинхронному коді","\u002Fweb-development\u002Fasync-programming-nodejs\u002Ferror-handling","18.web-development\u002F06.async-programming-nodejs\u002F10.error-handling",{"title":4326,"path":4327,"stem":4328},"Порівняння Node.js фреймворків","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fnodejs-frameworks","18.web-development\u002F06.async-programming-nodejs\u002F11.nodejs-frameworks",{"title":4330,"icon":4331,"path":4332,"stem":4333,"children":4334,"page":59},"Тема 7. Фреймворк NestJS. Контролери та маршрутизація","i-lucide-route","\u002Fweb-development\u002Fnestjs-controllers-routing","18.web-development\u002F07.nestjs-controllers-routing",[4335,4339,4343,4347,4351,4355,4359,4363,4367,4371,4375,4379,4383,4387,4391,4395,4399,4403,4407,4411,4415,4419],{"title":4336,"path":4337,"stem":4338},"Філософія та архітектура NestJS","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fnestjs-philosophy","18.web-development\u002F07.nestjs-controllers-routing\u002F01.nestjs-philosophy",{"title":4340,"path":4341,"stem":4342},"Три стовпи архітектури: модулі, контролери, провайдери","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fthree-pillars","18.web-development\u002F07.nestjs-controllers-routing\u002F02.three-pillars",{"title":4344,"path":4345,"stem":4346},"Інверсія керування (IoC) та ін","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fioc-and-di","18.web-development\u002F07.nestjs-controllers-routing\u002F03.ioc-and-di",{"title":4348,"path":4349,"stem":4350},"Встановлення NestJS CLI та створення проєкту","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fnestjs-cli-setup","18.web-development\u002F07.nestjs-controllers-routing\u002F04.nestjs-cli-setup",{"title":4352,"path":4353,"stem":4354},"Структура проєкту NestJS та конвенції","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fproject-structure","18.web-development\u002F07.nestjs-controllers-routing\u002F05.project-structure",{"title":4356,"path":4357,"stem":4358},"Контролери: основи маршрутизації","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fcontrollers-basics","18.web-development\u002F07.nestjs-controllers-routing\u002F06.controllers-basics",{"title":4360,"path":4361,"stem":4362},"Декоратори маршрутизації HTTP-методів","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Froute-decorators","18.web-development\u002F07.nestjs-controllers-routing\u002F07.route-decorators",{"title":4364,"path":4365,"stem":4366},"Параметри маршруту та декоратор @Param","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Froute-parameters","18.web-development\u002F07.nestjs-controllers-routing\u002F08.route-parameters",{"title":4368,"path":4369,"stem":4370},"Query-параметри та декоратор @Query","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fquery-parameters","18.web-development\u002F07.nestjs-controllers-routing\u002F09.query-parameters",{"title":4372,"path":4373,"stem":4374},"Тіло запиту та декоратор @Body","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Frequest-body","18.web-development\u002F07.nestjs-controllers-routing\u002F10.request-body",{"title":4376,"path":4377,"stem":4378},"Робота з заголовками запиту та відповіді","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fheaders-decorators","18.web-development\u002F07.nestjs-controllers-routing\u002F11.headers-decorators",{"title":4380,"path":4381,"stem":4382},"Data Transfer Objects (DTO): визначення та призначення","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fdto-introduction","18.web-development\u002F07.nestjs-controllers-routing\u002F12.dto-introduction",{"title":4384,"path":4385,"stem":4386},"Об'єкти Request та Response","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Frequest-response-objects","18.web-development\u002F07.nestjs-controllers-routing\u002F13.request-response-objects",{"title":4388,"path":4389,"stem":4390},"HTTP-статус коди та декоратор @HttpCode","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fhttp-status-codes","18.web-development\u002F07.nestjs-controllers-routing\u002F14.http-status-codes",{"title":4392,"path":4393,"stem":4394},"Перенаправлення (Redirects) та декоратор @Redirect","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fredirects","18.web-development\u002F07.nestjs-controllers-routing\u002F15.redirects",{"title":4396,"path":4397,"stem":4398},"Асинхронні обробники та Observables","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fasync-handlers","18.web-development\u002F07.nestjs-controllers-routing\u002F16.async-handlers",{"title":4400,"path":4401,"stem":4402},"Маршрутизація за піддоменами та версіонування API","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fsub-domain-routing","18.web-development\u002F07.nestjs-controllers-routing\u002F17.sub-domain-routing",{"title":4404,"path":4405,"stem":4406},"Області видимості контролерів (Scopes)","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fcontroller-scopes","18.web-development\u002F07.nestjs-controllers-routing\u002F18.controller-scopes",{"title":4408,"path":4409,"stem":4410},"Основні команди NestJS CLI","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fnestjs-cli-commands","18.web-development\u002F07.nestjs-controllers-routing\u002F19.nestjs-cli-commands",{"title":4412,"path":4413,"stem":4414},"Практичний приклад: створення CRUD-контролера","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fcrud-example","18.web-development\u002F07.nestjs-controllers-routing\u002F20.crud-example",{"title":4416,"path":4417,"stem":4418},"Тестування контролерів","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Ftesting-controllers","18.web-development\u002F07.nestjs-controllers-routing\u002F21.testing-controllers",{"title":4420,"path":4421,"stem":4422},"Best Practices для контролерів та маршрутизації","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fbest-practices","18.web-development\u002F07.nestjs-controllers-routing\u002F22.best-practices",{"title":4424,"icon":4425,"path":4426,"stem":4427,"children":4428,"page":59},"Тема 8. Провайдери, сервіси та модульна система NestJS","i-lucide-package","\u002Fweb-development\u002Fnestjs-providers-modules","18.web-development\u002F08.nestjs-providers-modules",[4429,4433,4437,4441,4445,4449,4453,4457,4461,4465,4469,4473,4477,4481,4485],{"title":4430,"path":4431,"stem":4432},"Концепція провайдерів у NestJS","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fproviders-concept","18.web-development\u002F08.nestjs-providers-modules\u002F01.providers-concept",{"title":4434,"path":4435,"stem":4436},"Сервіси: інкапсуляція бізнес-логіки","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fservices-business-logic","18.web-development\u002F08.nestjs-providers-modules\u002F02.services-business-logic",{"title":4438,"path":4439,"stem":4440},"Практика ін","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fdependency-injection-practice","18.web-development\u002F08.nestjs-providers-modules\u002F03.dependency-injection-practice",{"title":4442,"path":4443,"stem":4444},"Custom Providers: useValue, useClass, useFactory, useExisting","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fcustom-providers","18.web-development\u002F08.nestjs-providers-modules\u002F04.custom-providers",{"title":4446,"path":4447,"stem":4448},"Injection Tokens: рядкові та символьні токени","\u002Fweb-development\u002Fnestjs-providers-modules\u002Finjection-tokens","18.web-development\u002F08.nestjs-providers-modules\u002F05.injection-tokens",{"title":4450,"path":4451,"stem":4452},"Опціональні провайдери та декоратор @Optional","\u002Fweb-development\u002Fnestjs-providers-modules\u002Foptional-providers","18.web-development\u002F08.nestjs-providers-modules\u002F07.optional-providers",{"title":4454,"path":4455,"stem":4456},"Структура модулів: imports, controllers, providers, exports","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fmodules-structure","18.web-development\u002F08.nestjs-providers-modules\u002F08.modules-structure",{"title":4458,"path":4459,"stem":4460},"Feature Modules: ізоляція функціональності","\u002Fweb-development\u002Fnestjs-providers-modules\u002Ffeature-modules","18.web-development\u002F08.nestjs-providers-modules\u002F09.feature-modules",{"title":4462,"path":4463,"stem":4464},"Shared Modules: перевикористання провайдерів","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fshared-modules","18.web-development\u002F08.nestjs-providers-modules\u002F10.shared-modules",{"title":4466,"path":4467,"stem":4468},"Global Modules та декоратор @Global","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fglobal-modules","18.web-development\u002F08.nestjs-providers-modules\u002F11.global-modules",{"title":4470,"path":4471,"stem":4472},"Dynamic Modules: конфігурація під час виконання","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fdynamic-modules","18.web-development\u002F08.nestjs-providers-modules\u002F12.dynamic-modules",{"title":4474,"path":4475,"stem":4476},"Циклічні залежності та forwardRef","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fcircular-dependencies","18.web-development\u002F08.nestjs-providers-modules\u002F13.circular-dependencies",{"title":4478,"path":4479,"stem":4480},"Lifecycle Hooks: хуки життєвого циклу","\u002Fweb-development\u002Fnestjs-providers-modules\u002Flifecycle-hooks","18.web-development\u002F08.nestjs-providers-modules\u002F14.lifecycle-hooks",{"title":4482,"path":4483,"stem":4484},"ModuleRef: динамічний доступ до провайдерів","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fmodule-reference","18.web-development\u002F08.nestjs-providers-modules\u002F15.module-reference",{"title":4486,"path":4487,"stem":4488},"Тестування сервісів та провайдерів","\u002Fweb-development\u002Fnestjs-providers-modules\u002Ftesting-services","18.web-development\u002F08.nestjs-providers-modules\u002F16.testing-services",{"title":4490,"icon":4491,"path":4492,"stem":4493,"children":4494,"page":59},"Тема 9. Валідація даних та конвеєр обробки запитів у NestJS","i-lucide-filter","\u002Fweb-development\u002Fnestjs-validation-pipeline","18.web-development\u002F09.nestjs-validation-pipeline",[4495,4499,4503,4507,4511,4515,4519,4523,4527,4531,4535,4539,4543,4547,4551,4555,4559,4563,4567],{"title":4496,"path":4497,"stem":4498},"Request Pipeline: конвеєр обробки запитів","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Frequest-pipeline","18.web-development\u002F09.nestjs-validation-pipeline\u002F01.request-pipeline",{"title":4500,"path":4501,"stem":4502},"Pipes: концепція трансформації та валідації","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fpipes-concept","18.web-development\u002F09.nestjs-validation-pipeline\u002F02.pipes-concept",{"title":4504,"path":4505,"stem":4506},"Вбудовані pipes: ParseIntPipe, ParseBoolPipe, ParseUUIDPipe","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fbuilt-in-pipes","18.web-development\u002F09.nestjs-validation-pipeline\u002F03.built-in-pipes",{"title":4508,"path":4509,"stem":4510},"ValidationPipe: автоматична валідація DTO","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fvalidation-pipe","18.web-development\u002F09.nestjs-validation-pipeline\u002F04.validation-pipe",{"title":4512,"path":4513,"stem":4514},"Декоратори class-validator для DTO","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fclass-validator-decorators","18.web-development\u002F09.nestjs-validation-pipeline\u002F05.class-validator-decorators",{"title":4516,"path":4517,"stem":4518},"Створення кастомних валідаторів","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fcustom-validators","18.web-development\u002F09.nestjs-validation-pipeline\u002F06.custom-validators",{"title":4520,"path":4521,"stem":4522},"Створення власних Pipes","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fcustom-pipes","18.web-development\u002F09.nestjs-validation-pipeline\u002F07.custom-pipes",{"title":4524,"path":4525,"stem":4526},"Основи Middleware","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fmiddleware-basics","18.web-development\u002F09.nestjs-validation-pipeline\u002F08.middleware-basics",{"title":4528,"path":4529,"stem":4530},"Практичні приклади Middleware","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fmiddleware-examples","18.web-development\u002F09.nestjs-validation-pipeline\u002F09.middleware-examples",{"title":4532,"path":4533,"stem":4534},"Guards: захисні перехоплювачі доступу","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fguards-concept","18.web-development\u002F09.nestjs-validation-pipeline\u002F10.guards-concept",{"title":4536,"path":4537,"stem":4538},"Створення кастомних Guards","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fcustom-guards","18.web-development\u002F09.nestjs-validation-pipeline\u002F11.custom-guards",{"title":4540,"path":4541,"stem":4542},"Interceptors: перехоплення та трансформація відповідей","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Finterceptors-concept","18.web-development\u002F09.nestjs-validation-pipeline\u002F12.interceptors-concept",{"title":4544,"path":4545,"stem":4546},"Практичні приклади Interceptors","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Finterceptor-examples","18.web-development\u002F09.nestjs-validation-pipeline\u002F13.interceptor-examples",{"title":4548,"path":4549,"stem":4550},"Exception Filters: обробка виключень","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fexception-filters","18.web-development\u002F09.nestjs-validation-pipeline\u002F14.exception-filters",{"title":4552,"path":4553,"stem":4554},"Custom Exception Filters: спеціалізовані фільтри","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fcustom-exception-filters","18.web-development\u002F09.nestjs-validation-pipeline\u002F15.custom-exception-filters",{"title":4556,"path":4557,"stem":4558},"Execution Context: контекст виконання","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fexecution-context","18.web-development\u002F09.nestjs-validation-pipeline\u002F16.execution-context",{"title":4560,"path":4561,"stem":4562},"Custom Decorators: власні декоратори","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fcustom-decorators","18.web-development\u002F09.nestjs-validation-pipeline\u002F17.custom-decorators",{"title":4564,"path":4565,"stem":4566},"Global Components: глобальні компоненти","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fglobal-components","18.web-development\u002F09.nestjs-validation-pipeline\u002F18.global-components",{"title":4568,"path":4569,"stem":4570},"Pipeline Best Practices: найкращі практики","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fpipeline-best-practices","18.web-development\u002F09.nestjs-validation-pipeline\u002F19.pipeline-best-practices",{"title":4572,"icon":2881,"path":4573,"stem":4574,"children":4575,"page":59},"Інтеграція реляційних баз даних засобами TypeORM","\u002Fweb-development\u002Ftypeorm-integration","18.web-development\u002F10.typeorm-integration",[4576,4580,4584,4588,4592,4596,4600],{"title":4577,"path":4578,"stem":4579},"Робота з базами даних у Node.js через нативні драйвери","\u002Fweb-development\u002Ftypeorm-integration\u002F01-nodejs-database-drivers","18.web-development\u002F10.typeorm-integration\u002F01-nodejs-database-drivers",{"title":4581,"path":4582,"stem":4583},"ORM та знайомство з TypeORM","\u002Fweb-development\u002Ftypeorm-integration\u002F02-orm-and-typeorm-intro","18.web-development\u002F10.typeorm-integration\u002F02-orm-and-typeorm-intro",{"title":4585,"path":4586,"stem":4587},"Налаштування TypeORM у NestJS проєкті","\u002Fweb-development\u002Ftypeorm-integration\u002F03-typeorm-setup-nestjs","18.web-development\u002F10.typeorm-integration\u002F03-typeorm-setup-nestjs",{"title":4589,"path":4590,"stem":4591},"Entity класи та декоратори TypeORM","\u002Fweb-development\u002Ftypeorm-integration\u002F04-entities-and-decorators","18.web-development\u002F10.typeorm-integration\u002F04-entities-and-decorators",{"title":4593,"path":4594,"stem":4595},"Repository Pattern та CRUD операції","\u002Fweb-development\u002Ftypeorm-integration\u002F05-repository-pattern-crud","18.web-development\u002F10.typeorm-integration\u002F05-repository-pattern-crud",{"title":4597,"path":4598,"stem":4599},"Пагінація та фільтрація даних","\u002Fweb-development\u002Ftypeorm-integration\u002F06-pagination-filtering","18.web-development\u002F10.typeorm-integration\u002F06-pagination-filtering",{"title":4601,"path":4602,"stem":4603},"QueryBuilder для складних запитів","\u002Fweb-development\u002Ftypeorm-integration\u002F07-query-builder","18.web-development\u002F10.typeorm-integration\u002F07-query-builder",{"title":4605,"icon":4606,"path":4607,"stem":4608,"children":4609,"page":59},"Зв'язки між сутностями, міграції та оптимізація запитів","i-lucide-git-branch","\u002Fweb-development\u002Fentity-relations-migrations","18.web-development\u002F11.entity-relations-migrations",[4610,4614,4618,4622,4626],{"title":4611,"path":4612,"stem":4613},"Зв'язки One-to-Many та Many-to-One","\u002Fweb-development\u002Fentity-relations-migrations\u002F01-one-to-many-many-to-one","18.web-development\u002F11.entity-relations-migrations\u002F01-one-to-many-many-to-one",{"title":4615,"path":4616,"stem":4617},"Зв'язки One-to-One та Many-to-Many","\u002Fweb-development\u002Fentity-relations-migrations\u002F02-one-to-one-many-to-many","18.web-development\u002F11.entity-relations-migrations\u002F02-one-to-one-many-to-many",{"title":4619,"path":4620,"stem":4621},"Керування міграціями бази даних","\u002Fweb-development\u002Fentity-relations-migrations\u002F03-migrations-management","18.web-development\u002F11.entity-relations-migrations\u002F03-migrations-management",{"title":4623,"path":4624,"stem":4625},"Транзакції у TypeORM","\u002Fweb-development\u002Fentity-relations-migrations\u002F04-transactions","18.web-development\u002F11.entity-relations-migrations\u002F04-transactions",{"title":4627,"path":4628,"stem":4629,"children":4630},"Індекси та оптимізація запитів","\u002Fweb-development\u002Fentity-relations-migrations\u002F05-indexes-optimization","18.web-development\u002F11.entity-relations-migrations\u002F05-indexes-optimization",[4631],{"title":4627,"path":4628,"stem":4629},{"title":4633,"icon":4634,"path":4635,"stem":4636,"children":4637,"page":59},"Механізми автентифікації у вебзастосунках","i-lucide-key","\u002Fweb-development\u002Fauthentication","18.web-development\u002F12.authentication",[4638,4642,4646,4650,4654,4658,4662,4666,4670],{"title":4639,"path":4640,"stem":4641},"Автентифікація vs Авторизація","\u002Fweb-development\u002Fauthentication\u002F01-authentication-vs-authorization","18.web-development\u002F12.authentication\u002F01-authentication-vs-authorization",{"title":4643,"path":4644,"stem":4645},"Стратегії автентифікації","\u002Fweb-development\u002Fauthentication\u002F02-authentication-strategies","18.web-development\u002F12.authentication\u002F02-authentication-strategies",{"title":4647,"path":4648,"stem":4649},"Автентифікація на основі сесій","\u002Fweb-development\u002Fauthentication\u002F03-session-based-authentication","18.web-development\u002F12.authentication\u002F03-session-based-authentication",{"title":4651,"path":4652,"stem":4653},"Структура JSON Web Token (JWT)","\u002Fweb-development\u002Fauthentication\u002F04-jwt-structure","18.web-development\u002F12.authentication\u002F04-jwt-structure",{"title":4655,"path":4656,"stem":4657},"Інтеграція JWT у NestJS","\u002Fweb-development\u002Fauthentication\u002F05-nestjs-jwt-integration","18.web-development\u002F12.authentication\u002F05-nestjs-jwt-integration",{"title":4659,"path":4660,"stem":4661},"Passport.js стратегії у NestJS","\u002Fweb-development\u002Fauthentication\u002F06-passport-strategies","18.web-development\u002F12.authentication\u002F06-passport-strategies",{"title":4663,"path":4664,"stem":4665},"Безпечне зберігання паролів: хешування та криптографічний захист","\u002Fweb-development\u002Fauthentication\u002F07-password-hashing","18.web-development\u002F12.authentication\u002F07-password-hashing",{"title":4667,"path":4668,"stem":4669},"Refresh Token та безпечне оновлення доступу","\u002Fweb-development\u002Fauthentication\u002F08-refresh-tokens","18.web-development\u002F12.authentication\u002F08-refresh-tokens",{"title":4671,"path":4672,"stem":4673},"OAuth 2.0 та OpenID Connect: делегована автентифікація","\u002Fweb-development\u002Fauthentication\u002F09-oauth2-openid","18.web-development\u002F12.authentication\u002F09-oauth2-openid",{"title":4675,"icon":4676,"path":4677,"stem":4678,"children":4679,"page":59},"Авторизація та безпека серверних застосунків","i-lucide-shield","\u002Fweb-development\u002Fauthorization-security","18.web-development\u002F13.authorization-security",[4680,4684,4688,4692,4696,4700,4704,4708,4712,4716],{"title":4681,"path":4682,"stem":4683},"Моделі авторизації","\u002Fweb-development\u002Fauthorization-security\u002F01-authorization-models","18.web-development\u002F13.authorization-security\u002F01-authorization-models",{"title":4685,"path":4686,"stem":4687},"Реалізація RBAC у NestJS","\u002Fweb-development\u002Fauthorization-security\u002F02-rbac-implementation","18.web-development\u002F13.authorization-security\u002F02-rbac-implementation",{"title":4689,"path":4690,"stem":4691},"Permission-Based Access Control","\u002Fweb-development\u002Fauthorization-security\u002F03-permission-based-access","18.web-development\u002F13.authorization-security\u002F03-permission-based-access",{"title":4693,"path":4694,"stem":4695},"ABAC та бібліотека CASL","\u002Fweb-development\u002Fauthorization-security\u002F04-abac-casl","18.web-development\u002F13.authorization-security\u002F04-abac-casl",{"title":4697,"path":4698,"stem":4699},"Кастомні декоратори та метадані","\u002Fweb-development\u002Fauthorization-security\u002F05-custom-decorators-metadata","18.web-development\u002F13.authorization-security\u002F05-custom-decorators-metadata",{"title":4701,"path":4702,"stem":4703},"Конфігурація CORS","\u002Fweb-development\u002Fauthorization-security\u002F06-cors-configuration","18.web-development\u002F13.authorization-security\u002F06-cors-configuration",{"title":4705,"path":4706,"stem":4707},"Захист через HTTP Security Headers (Helmet)","\u002Fweb-development\u002Fauthorization-security\u002F07-helmet-security-headers","18.web-development\u002F13.authorization-security\u002F07-helmet-security-headers",{"title":4709,"path":4710,"stem":4711},"Rate Limiting та Throttling","\u002Fweb-development\u002Fauthorization-security\u002F08-rate-limiting-throttling","18.web-development\u002F13.authorization-security\u002F08-rate-limiting-throttling",{"title":4713,"path":4714,"stem":4715},"Захист від поширених атак","\u002Fweb-development\u002Fauthorization-security\u002F09-common-attacks-protection","18.web-development\u002F13.authorization-security\u002F09-common-attacks-protection",{"title":4717,"path":4718,"stem":4719},"HTTPS у продакшені","\u002Fweb-development\u002Fauthorization-security\u002F10-https-production","18.web-development\u002F13.authorization-security\u002F10-https-production",{"title":4721,"icon":871,"path":4722,"stem":4723,"children":4724,"page":59},"Комунікація у реальному часі, нотифікації та фонові задачі","\u002Fweb-development\u002Frealtime-notifications-jobs","18.web-development\u002F14.realtime-notifications-jobs",[4725,4729,4733,4737,4741,4745,4748,4751,4755,4759],{"title":4726,"path":4727,"stem":4728},"Методи комунікації у реальному часі","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F01-realtime-communication-methods","18.web-development\u002F14.realtime-notifications-jobs\u002F01-realtime-communication-methods",{"title":4730,"path":4731,"stem":4732},"WebSocket Gateway у NestJS","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F02-websocket-gateway","18.web-development\u002F14.realtime-notifications-jobs\u002F02-websocket-gateway",{"title":4734,"path":4735,"stem":4736},"Lifecycle та Rooms у WebSocket","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F03-websocket-lifecycle-rooms","18.web-development\u002F14.realtime-notifications-jobs\u002F03-websocket-lifecycle-rooms",{"title":4738,"path":4739,"stem":4740},"Server-Sent Events (SSE)","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F04-server-sent-events","18.web-development\u002F14.realtime-notifications-jobs\u002F04-server-sent-events",{"title":4742,"path":4743,"stem":4744},"Архітектура системи нотифікацій","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F05-notification-system","18.web-development\u002F14.realtime-notifications-jobs\u002F05-notification-system",{"title":904,"path":4746,"stem":4747},"\u002Fweb-development\u002Frealtime-notifications-jobs\u002F06-email-notifications","18.web-development\u002F14.realtime-notifications-jobs\u002F06-email-notifications",{"title":900,"path":4749,"stem":4750},"\u002Fweb-development\u002Frealtime-notifications-jobs\u002F07-web-push-notifications","18.web-development\u002F14.realtime-notifications-jobs\u002F07-web-push-notifications",{"title":4752,"path":4753,"stem":4754},"Фонові задачі та черги","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F08-background-jobs-queues","18.web-development\u002F14.realtime-notifications-jobs\u002F08-background-jobs-queues",{"title":4756,"path":4757,"stem":4758},"Планувальники та Cron jobs","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F09-schedulers-cron","18.web-development\u002F14.realtime-notifications-jobs\u002F09-schedulers-cron",{"title":4760,"path":4761,"stem":4762},"Практичні сценарії застосування","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F10-practical-scenarios","18.web-development\u002F14.realtime-notifications-jobs\u002F10-practical-scenarios",{"title":4764,"icon":4765,"path":4766,"stem":4767,"children":4768,"page":59},"Тестування, документування та розгортання застосунків","i-lucide-rocket","\u002Fweb-development\u002Ftesting-documentation-deployment","18.web-development\u002F15.testing-documentation-deployment",[4769,4773,4777,4781,4785,4789,4793,4797,4801,4805],{"title":4770,"path":4771,"stem":4772},"Піраміда тестування та стратегія","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F01-testing-pyramid-strategy","18.web-development\u002F15.testing-documentation-deployment\u002F01-testing-pyramid-strategy",{"title":4774,"path":4775,"stem":4776},"Основи Jest у NestJS","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F02-jest-nestjs-basics","18.web-development\u002F15.testing-documentation-deployment\u002F02-jest-nestjs-basics",{"title":4778,"path":4779,"stem":4780},"Unit-тестування сервісів","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F03-unit-testing-services","18.web-development\u002F15.testing-documentation-deployment\u002F03-unit-testing-services",{"title":4782,"path":4783,"stem":4784},"E2E тестування та покриття коду","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F04-e2e-testing-coverage","18.web-development\u002F15.testing-documentation-deployment\u002F04-e2e-testing-coverage",{"title":4786,"path":4787,"stem":4788},"Swagger, OpenAPI, Scalar та Arazzo","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F05-swagger-openapi","18.web-development\u002F15.testing-documentation-deployment\u002F05-swagger-openapi",{"title":4790,"path":4791,"stem":4792},"Керування конфігурацією","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F06-configuration-management","18.web-development\u002F15.testing-documentation-deployment\u002F06-configuration-management",{"title":4794,"path":4795,"stem":4796},"Docker та контейнеризація","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F07-docker-containerization","18.web-development\u002F15.testing-documentation-deployment\u002F07-docker-containerization",{"title":4798,"path":4799,"stem":4800},"CI\u002FCD Pipelines","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F08-cicd-pipelines","18.web-development\u002F15.testing-documentation-deployment\u002F08-cicd-pipelines",{"title":4802,"path":4803,"stem":4804},"Логування та моніторинг","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F09-logging-monitoring","18.web-development\u002F15.testing-documentation-deployment\u002F09-logging-monitoring",{"title":4806,"path":4807,"stem":4808},"Серіалізація та компресія","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F10-serialization-compression","18.web-development\u002F15.testing-documentation-deployment\u002F10-serialization-compression",{"title":4810,"icon":4811,"path":4812,"stem":4813,"children":4814,"page":59},"AI Core: мислення AI","i-lucide-brain","\u002Fai-core","19.ai-core",[4815,4856,4905,4943],{"title":4816,"icon":4765,"path":4817,"stem":4818,"children":4819,"page":59},"Вхід у професію AI Native Developer","\u002Fai-core\u002Fai-native-developer","19.ai-core\u002F01.ai-native-developer",[4820,4824,4828,4832,4836,4840,4844,4848,4852],{"title":4821,"path":4822,"stem":4823},"Вступ до професії розробника цифрових продуктів","\u002Fai-core\u002Fai-native-developer\u002Fdigital-products","19.ai-core\u002F01.ai-native-developer\u002F01.digital-products",{"title":4825,"path":4826,"stem":4827},"Професія розробника програмного забезпечення","\u002Fai-core\u002Fai-native-developer\u002Fsoftware-developer","19.ai-core\u002F01.ai-native-developer\u002F02.software-developer",{"title":4829,"path":4830,"stem":4831},"Професія AI Native Developer","\u002Fai-core\u002Fai-native-developer\u002Fai-native-developer","19.ai-core\u002F01.ai-native-developer\u002F03.ai-native-developer",{"title":4833,"path":4834,"stem":4835},"Вплив AI на розробку програмного забезпечення","\u002Fai-core\u002Fai-native-developer\u002Fai-impact-on-development","19.ai-core\u002F01.ai-native-developer\u002F04.ai-impact-on-development",{"title":4837,"path":4838,"stem":4839},"Життєвий цикл цифрового продукту","\u002Fai-core\u002Fai-native-developer\u002Fproduct-lifecycle","19.ai-core\u002F01.ai-native-developer\u002F05.product-lifecycle",{"title":4841,"path":4842,"stem":4843},"Застосування AI на етапах створення цифрового продукту","\u002Fai-core\u002Fai-native-developer\u002Fai-in-product-creation","19.ai-core\u002F01.ai-native-developer\u002F06.ai-in-product-creation",{"title":4845,"path":4846,"stem":4847},"Розподіл завдань між людиною та AI","\u002Fai-core\u002Fai-native-developer\u002Fhuman-vs-ai-tasks","19.ai-core\u002F01.ai-native-developer\u002F07.human-vs-ai-tasks",{"title":4849,"path":4850,"stem":4851},"Компетенції AI Native Developer","\u002Fai-core\u002Fai-native-developer\u002Fcompetencies","19.ai-core\u002F01.ai-native-developer\u002F08.competencies",{"title":4853,"path":4854,"stem":4855},"Карта професійного розвитку AI Native Developer","\u002Fai-core\u002Fai-native-developer\u002Fcareer-roadmap","19.ai-core\u002F01.ai-native-developer\u002F09.career-roadmap",{"title":4857,"icon":255,"path":4858,"stem":4859,"children":4860,"page":59},"Штучний інтелект і машинне навчання","\u002Fai-core\u002Fai-and-machine-learning","19.ai-core\u002F02.ai-and-machine-learning",[4861,4865,4869,4873,4877,4881,4885,4889,4893,4897,4901],{"title":4862,"path":4863,"stem":4864},"Штучний інтелект","\u002Fai-core\u002Fai-and-machine-learning\u002Fwhat-is-ai","19.ai-core\u002F02.ai-and-machine-learning\u002F01.what-is-ai",{"title":4866,"path":4867,"stem":4868},"Відмінність AI від інших програмних систем","\u002Fai-core\u002Fai-and-machine-learning\u002Fai-vs-automation","19.ai-core\u002F02.ai-and-machine-learning\u002F02.ai-vs-automation",{"title":4870,"path":4871,"stem":4872},"Завдання штучного інтелекту","\u002Fai-core\u002Fai-and-machine-learning\u002Fai-tasks","19.ai-core\u002F02.ai-and-machine-learning\u002F03.ai-tasks",{"title":4874,"path":4875,"stem":4876},"Machine Learning","\u002Fai-core\u002Fai-and-machine-learning\u002Fmachine-learning","19.ai-core\u002F02.ai-and-machine-learning\u002F04.machine-learning",{"title":4878,"path":4879,"stem":4880},"Machine Learning Workflow","\u002Fai-core\u002Fai-and-machine-learning\u002Fml-workflow","19.ai-core\u002F02.ai-and-machine-learning\u002F05.ml-workflow",{"title":4882,"path":4883,"stem":4884},"Типи машинного навчання","\u002Fai-core\u002Fai-and-machine-learning\u002Fml-types","19.ai-core\u002F02.ai-and-machine-learning\u002F06.ml-types",{"title":4886,"path":4887,"stem":4888},"Generative AI","\u002Fai-core\u002Fai-and-machine-learning\u002Fgenerative-ai","19.ai-core\u002F02.ai-and-machine-learning\u002F07.generative-ai",{"title":4890,"path":4891,"stem":4892},"Типи контенту, створюваного AI","\u002Fai-core\u002Fai-and-machine-learning\u002Fai-content-types","19.ai-core\u002F02.ai-and-machine-learning\u002F08.ai-content-types",{"title":4894,"path":4895,"stem":4896},"Великі мовні моделі","\u002Fai-core\u002Fai-and-machine-learning\u002Flarge-language-models","19.ai-core\u002F02.ai-and-machine-learning\u002F09.large-language-models",{"title":4898,"path":4899,"stem":4900},"Можливості та обмеження Generative AI","\u002Fai-core\u002Fai-and-machine-learning\u002Fcapabilities-and-limitations","19.ai-core\u002F02.ai-and-machine-learning\u002F10.capabilities-and-limitations",{"title":4902,"path":4903,"stem":4904},"Сучасні AI-асистенти","\u002Fai-core\u002Fai-and-machine-learning\u002Fmodern-ai-assistants","19.ai-core\u002F02.ai-and-machine-learning\u002F11.modern-ai-assistants",{"title":4906,"icon":4907,"path":4908,"stem":4909,"children":4910,"page":59},"Постановка завдань для AI: принципи створення промптів","i-lucide-message-square-text","\u002Fai-core\u002Fprompt-engineering","19.ai-core\u002F03.prompt-engineering",[4911,4915,4919,4923,4927,4931,4935,4939],{"title":4912,"path":4913,"stem":4914},"Промпт як інструмент","\u002Fai-core\u002Fprompt-engineering\u002Fprompt-as-tool","19.ai-core\u002F03.prompt-engineering\u002F01.prompt-as-tool",{"title":4916,"path":4917,"stem":4918},"Принципи створення промптів","\u002Fai-core\u002Fprompt-engineering\u002Fprompt-principles","19.ai-core\u002F03.prompt-engineering\u002F02.prompt-principles",{"title":4920,"path":4921,"stem":4922},"Структура промпта","\u002Fai-core\u002Fprompt-engineering\u002Fprompt-structure","19.ai-core\u002F03.prompt-engineering\u002F03.prompt-structure",{"title":4924,"path":4925,"stem":4926},"Види промптів за типом задачі","\u002Fai-core\u002Fprompt-engineering\u002Fprompt-types","19.ai-core\u002F03.prompt-engineering\u002F04.prompt-types",{"title":4928,"path":4929,"stem":4930},"Прийоми посилення промпта","\u002Fai-core\u002Fprompt-engineering\u002Fprompt-enhancement","19.ai-core\u002F03.prompt-engineering\u002F05.prompt-enhancement",{"title":4932,"path":4933,"stem":4934},"Розбір і покращення промпта","\u002Fai-core\u002Fprompt-engineering\u002Fprompt-analysis","19.ai-core\u002F03.prompt-engineering\u002F06.prompt-analysis",{"title":4936,"path":4937,"stem":4938},"Типові помилки під час створення промптів","\u002Fai-core\u002Fprompt-engineering\u002Fcommon-mistakes","19.ai-core\u002F03.prompt-engineering\u002F07.common-mistakes",{"title":4940,"path":4941,"stem":4942},"Практикум: особиста бібліотека промптів","\u002Fai-core\u002Fprompt-engineering\u002Fprompt-library","19.ai-core\u002F03.prompt-engineering\u002F08.prompt-library",{"title":4944,"icon":793,"path":4945,"stem":4946,"children":4947,"page":59},"Перевірка результатів, безпека та AI Native Workflow","\u002Fai-core\u002Fverification-security-workflow","19.ai-core\u002F04.verification-security-workflow",[4948,4952,4956,4960,4964,4968,4972,4976,4980],{"title":4949,"path":4950,"stem":4951},"Межі можливостей AI","\u002Fai-core\u002Fverification-security-workflow\u002Fai-limitations","19.ai-core\u002F04.verification-security-workflow\u002F01.ai-limitations",{"title":4953,"path":4954,"stem":4955},"Галюцинації AI","\u002Fai-core\u002Fverification-security-workflow\u002Fai-hallucinations","19.ai-core\u002F04.verification-security-workflow\u002F02.ai-hallucinations",{"title":4957,"path":4958,"stem":4959},"Критичне мислення під час роботи з AI","\u002Fai-core\u002Fverification-security-workflow\u002Fcritical-thinking","19.ai-core\u002F04.verification-security-workflow\u002F03.critical-thinking",{"title":4961,"path":4962,"stem":4963},"Перевірка результатів роботи AI","\u002Fai-core\u002Fverification-security-workflow\u002Fresult-verification","19.ai-core\u002F04.verification-security-workflow\u002F04.result-verification",{"title":4965,"path":4966,"stem":4967},"Захист даних під час роботи з AI","\u002Fai-core\u002Fverification-security-workflow\u002Fdata-protection","19.ai-core\u002F04.verification-security-workflow\u002F05.data-protection",{"title":4969,"path":4970,"stem":4971},"Авторське право та навчальна доброчесність","\u002Fai-core\u002Fverification-security-workflow\u002Fcopyright-integrity","19.ai-core\u002F04.verification-security-workflow\u002F06.copyright-integrity",{"title":4973,"path":4974,"stem":4975},"Відповідальне використання AI","\u002Fai-core\u002Fverification-security-workflow\u002Fresponsible-use","19.ai-core\u002F04.verification-security-workflow\u002F07.responsible-use",{"title":4977,"path":4978,"stem":4979},"AI Native Workflow","\u002Fai-core\u002Fverification-security-workflow\u002Fai-native-workflow","19.ai-core\u002F04.verification-security-workflow\u002F08.ai-native-workflow",{"title":4981,"path":4982,"stem":4983},"Застосування AI Native Workflow під час створення цифрового продукту","\u002Fai-core\u002Fverification-security-workflow\u002Fworkflow-in-practice","19.ai-core\u002F04.verification-security-workflow\u002F09.workflow-in-practice",{"title":4985,"icon":4986,"path":4987,"stem":4988,"children":4989,"page":59},"AI Developer: Vibe Coding Sprint","i-lucide-code-xml","\u002Fai-developer","20.ai-developer",[4990,5016,5038,5059],{"title":4991,"icon":4992,"path":4993,"stem":4994,"children":4995,"page":59},"Проєктування і чорнова версія","i-lucide-pencil-ruler","\u002Fai-developer\u002Fdraft-creation","20.ai-developer\u002F01.draft-creation",[4996,5000,5004,5008,5012],{"title":4997,"path":4998,"stem":4999},"Парадигма Vibe Coding Workflow","\u002Fai-developer\u002Fdraft-creation\u002Fvibe-coding-workflow","20.ai-developer\u002F01.draft-creation\u002F01.vibe-coding-workflow",{"title":5001,"path":5002,"stem":5003},"AI-середовище швидкої розробки","\u002Fai-developer\u002Fdraft-creation\u002Fai-ide-environment","20.ai-developer\u002F01.draft-creation\u002F02.ai-ide-environment",{"title":5005,"path":5006,"stem":5007},"Користувацьке завдання та межі першої версії","\u002Fai-developer\u002Fdraft-creation\u002Fproduct-scope-and-mvp","20.ai-developer\u002F01.draft-creation\u002F03.product-scope-and-mvp",{"title":5009,"path":5010,"stem":5011},"Архітектура інтерфейсу та стани застосунку","\u002Fai-developer\u002Fdraft-creation\u002Fapplication-architecture-and-states","20.ai-developer\u002F01.draft-creation\u002F04.application-architecture-and-states",{"title":5013,"path":5014,"stem":5015},"Генерація та фіксація чорнової версії","\u002Fai-developer\u002Fdraft-creation\u002Fgenerating-draft-version","20.ai-developer\u002F01.draft-creation\u002F05.generating-draft-version",{"title":5017,"icon":5018,"path":5019,"stem":5020,"children":5021,"page":59},"Перша робоча версія","i-lucide-play-circle","\u002Fai-developer\u002Ffirst-working-version","20.ai-developer\u002F02.first-working-version",[5022,5026,5030,5034],{"title":5023,"path":5024,"stem":5025},"Уточнення контексту проєкту для AI","\u002Fai-developer\u002Ffirst-working-version\u002Frefining-project-context","20.ai-developer\u002F02.first-working-version\u002F01.refining-project-context",{"title":5027,"path":5028,"stem":5029},"Стратегія завдань для AI-розробки","\u002Fai-developer\u002Ffirst-working-version\u002Fai-prompting-strategy","20.ai-developer\u002F02.first-working-version\u002F02.ai-prompting-strategy",{"title":5031,"path":5032,"stem":5033},"Доопрацювання до першої робочої версії","\u002Fai-developer\u002Ffirst-working-version\u002Frefining-to-working-version","20.ai-developer\u002F02.first-working-version\u002F03.refining-to-working-version",{"title":5035,"path":5036,"stem":5037},"Перевірка першої робочої версії","\u002Fai-developer\u002Ffirst-working-version\u002Ftesting-first-working-version","20.ai-developer\u002F02.first-working-version\u002F04.testing-first-working-version",{"title":5039,"icon":3088,"path":5040,"stem":5041,"children":5042,"page":59},"Ітерації, дебагінг та відновлення","\u002Fai-developer\u002Fiteration-debugging-recovery","20.ai-developer\u002F03.iteration-debugging-recovery",[5043,5047,5051,5055],{"title":5044,"path":5045,"stem":5046},"Управління точковими змінами продукту","\u002Fai-developer\u002Fiteration-debugging-recovery\u002Fchange-management","20.ai-developer\u002F03.iteration-debugging-recovery\u002F01.change-management",{"title":5048,"path":5049,"stem":5050},"Надійність інтерфейсу та обробка помилок","\u002Fai-developer\u002Fiteration-debugging-recovery\u002Fscenario-reliability-and-errors","20.ai-developer\u002F03.iteration-debugging-recovery\u002F02.scenario-reliability-and-errors",{"title":5052,"path":5053,"stem":5054},"Керування контекстом і збереження версій","\u002Fai-developer\u002Fiteration-debugging-recovery\u002Fproject-context-and-versions","20.ai-developer\u002F03.iteration-debugging-recovery\u002F03.project-context-and-versions",{"title":5056,"path":5057,"stem":5058},"Збої AI-розробки, ліміти та аварійне відновлення","\u002Fai-developer\u002Fiteration-debugging-recovery\u002Fai-breakdowns-and-recovery","20.ai-developer\u002F03.iteration-debugging-recovery\u002F04.ai-breakdowns-and-recovery",{"title":5060,"icon":5061,"path":5062,"stem":5063,"children":5064,"page":59},"Перевірка та завершення продукту","i-lucide-check-check","\u002Fai-developer\u002Fverification-and-completion","20.ai-developer\u002F04.verification-and-completion",[5065,5069,5073],{"title":5066,"path":5067,"stem":5068},"Комплексний аудит та підсумкове тестування","\u002Fai-developer\u002Fverification-and-completion\u002Ffinal-product-testing","20.ai-developer\u002F04.verification-and-completion\u002F01.final-product-testing",{"title":5070,"path":5071,"stem":5072},"Підготовка підсумкової версії коду","\u002Fai-developer\u002Fverification-and-completion\u002Fpreparing-release-version","20.ai-developer\u002F04.verification-and-completion\u002F02.preparing-release-version",{"title":5074,"path":5075,"stem":5076},"Демонстрація, публікація та критерії оцінювання","\u002Fai-developer\u002Fverification-and-completion\u002Fproduct-showcase-and-publishing","20.ai-developer\u002F04.verification-and-completion\u002F03.product-showcase-and-publishing",{"title":5078,"path":5079,"stem":5080,"children":5081,"page":59},"Tailwind","\u002Ftailwind","21.tailwind",[5082,5086,5090,5094,5098,5102,5106,5110,5114,5118,5122,5126],{"title":5083,"path":5084,"stem":5085},"Що таке Tailwind CSS і навіщо він потрібен","\u002Ftailwind\u002Ftailwind-intro-philosophy","21.tailwind\u002F01.tailwind-intro-philosophy",{"title":5087,"path":5088,"stem":5089},"Встановлення та налаштування Tailwind CSS v4","\u002Ftailwind\u002Ftailwind-installation-setup","21.tailwind\u002F02.tailwind-installation-setup",{"title":5091,"path":5092,"stem":5093},"Utility-класи: основи та система Tailwind","\u002Ftailwind\u002Ftailwind-utility-classes-core","21.tailwind\u002F03.tailwind-utility-classes-core",{"title":5095,"path":5096,"stem":5097},"Layout: Flexbox та Grid через Tailwind","\u002Ftailwind\u002Ftailwind-flexbox-grid","21.tailwind\u002F04.tailwind-flexbox-grid",{"title":5099,"path":5100,"stem":5101},"Кастомізація теми через @theme у Tailwind v4","\u002Ftailwind\u002Ftailwind-theme-customization","21.tailwind\u002F05.tailwind-theme-customization",{"title":5103,"path":5104,"stem":5105},"Варіанти: hover, focus, responsive, dark mode та нові v4","\u002Ftailwind\u002Ftailwind-variants-states","21.tailwind\u002F06.tailwind-variants-states",{"title":5107,"path":5108,"stem":5109},"Типографіка та система кольорів у Tailwind v4","\u002Ftailwind\u002Ftailwind-typography-colors","21.tailwind\u002F07.tailwind-typography-colors",{"title":5111,"path":5112,"stem":5113},"Компоненти та повторюваність: @apply, @utility та патерни","\u002Ftailwind\u002Ftailwind-components-patterns","21.tailwind\u002F08.tailwind-components-patterns",{"title":5115,"path":5116,"stem":5117},"Темна тема та система дизайн-токенів у Tailwind v4","\u002Ftailwind\u002Ftailwind-dark-mode-theming","21.tailwind\u002F09.tailwind-dark-mode-theming",{"title":5119,"path":5120,"stem":5121},"Довільні значення та контейнерні запити у Tailwind v4","\u002Ftailwind\u002Ftailwind-arbitrary-container-queries","21.tailwind\u002F10.tailwind-arbitrary-container-queries",{"title":5123,"path":5124,"stem":5125},"Анімації, трансформації та 3D у Tailwind v4","\u002Ftailwind\u002Ftailwind-animations-transforms","21.tailwind\u002F11.tailwind-animations-transforms",{"title":5127,"path":5128,"stem":5129},"Tailwind CLI, PostCSS та інтеграція з фреймворками","\u002Ftailwind\u002Ftailwind-cli-tooling","21.tailwind\u002F12.tailwind-cli-tooling",{"title":5131,"path":5132,"stem":5133,"children":5134,"page":59},"React Typescript","\u002Freact-typescript","22.react-typescript",[5135,5160,5164,5168,5172,5176,5180,5184,5188,5192,5222,5226,5230,5234,5238],{"title":5136,"path":5137,"stem":5138,"children":5139,"page":59},"From Html To Project","\u002Freact-typescript\u002Ffrom-html-to-project","22.react-typescript\u002F01.from-html-to-project",[5140,5144,5148,5152,5156],{"title":5141,"path":5142,"stem":5143},"Від одного HTML-файлу до повноцінного проєкту","\u002Freact-typescript\u002Ffrom-html-to-project\u002Fevolution","22.react-typescript\u002F01.from-html-to-project\u002F01.evolution",{"title":5145,"path":5146,"stem":5147},"Що таке React","\u002Freact-typescript\u002Ffrom-html-to-project\u002Fwhat-is-react","22.react-typescript\u002F01.from-html-to-project\u002F02.what-is-react",{"title":5149,"path":5150,"stem":5151},"JSX та TSX — синтаксичний цукор, а не магія","\u002Freact-typescript\u002Ffrom-html-to-project\u002Fjsx-tsx-syntax","22.react-typescript\u002F01.from-html-to-project\u002F03.jsx-tsx-syntax",{"title":5153,"path":5154,"stem":5155},"Компоненти — будівельні блоки інтерфейсу","\u002Freact-typescript\u002Ffrom-html-to-project\u002Fcomponents","22.react-typescript\u002F01.from-html-to-project\u002F04.components",{"title":5157,"path":5158,"stem":5159},"JSX — розмітка всередині TypeScript","\u002Freact-typescript\u002Ffrom-html-to-project\u002Fjsx-expressions","22.react-typescript\u002F01.from-html-to-project\u002F05.jsx-expressions",{"title":5161,"path":5162,"stem":5163},"Хук useReducer: структуроване управління складним станом","\u002Freact-typescript\u002Fuse-reducer","22.react-typescript\u002F23.use-reducer",{"title":5165,"path":5166,"stem":5167},"Context API: передавання даних без «пропс-дрілінгу»","\u002Freact-typescript\u002Fcontext-api","22.react-typescript\u002F24.context-api",{"title":5169,"path":5170,"stem":5171},"Синхронізація з ефектами: хук useEffect та функції очищення","\u002Freact-typescript\u002Fuse-effect","22.react-typescript\u002F27.use-effect",{"title":5173,"path":5174,"stem":5175},"Можливо, вам не потрібен ефект: антипатерни та альтернативи","\u002Freact-typescript\u002Fyou-might-not-need-effect","22.react-typescript\u002F28.you-might-not-need-effect",{"title":5177,"path":5178,"stem":5179},"Життєвий цикл реактивних ефектів: мислення процесами синхронізації","\u002Freact-typescript\u002Flifecycle-of-reactive-effects","22.react-typescript\u002F29.lifecycle-of-reactive-effects",{"title":5181,"path":5182,"stem":5183},"Розділення подій та ефектів: реактивна проти нереактивної логіки","\u002Freact-typescript\u002Fseparating-events-from-effects","22.react-typescript\u002F30.separating-events-from-effects",{"title":5185,"path":5186,"stem":5187},"Видалення зайвих залежностей ефектів та оптимізація синхронізації","\u002Freact-typescript\u002Fremoving-effect-dependencies","22.react-typescript\u002F31.removing-effect-dependencies",{"title":5189,"path":5190,"stem":5191},"Кастомні хуки: повторне використання та композиція реактивної логіки","\u002Freact-typescript\u002Fcustom-hooks","22.react-typescript\u002F32.custom-hooks",{"title":5193,"path":5194,"stem":5195,"children":5196},"React Router v7: Маршрутизація в SPA","\u002Freact-typescript\u002Freact-router-v7","22.react-typescript\u002F33.react-router-v7\u002Findex",[5197,5198,5202,5206,5210,5214,5218],{"title":5193,"path":5194,"stem":5195},{"title":5199,"path":5200,"stem":5201},"Встановлення та базова конфігурація React Router v7","\u002Freact-typescript\u002Freact-router-v7\u002Finstallation-setup","22.react-typescript\u002F33.react-router-v7\u002F01.installation-setup",{"title":5203,"path":5204,"stem":5205},"Вкладені маршрути та Outlet: архітектура складних макетів","\u002Freact-typescript\u002Freact-router-v7\u002Fnested-routes-outlet","22.react-typescript\u002F33.react-router-v7\u002F02.nested-routes-outlet",{"title":5207,"path":5208,"stem":5209},"Динамічні маршрути та параметри URL","\u002Freact-typescript\u002Freact-router-v7\u002Fdynamic-routes-params","22.react-typescript\u002F33.react-router-v7\u002F03.dynamic-routes-params",{"title":5211,"path":5212,"stem":5213},"Навігація та корисні хуки React Router","\u002Freact-typescript\u002Freact-router-v7\u002Fnavigation-hooks","22.react-typescript\u002F33.react-router-v7\u002F04.navigation-hooks",{"title":5215,"path":5216,"stem":5217},"Обробка помилок та 404: ErrorBoundary і fallback-маршрути","\u002Freact-typescript\u002Freact-router-v7\u002Ferror-handling-404","22.react-typescript\u002F33.react-router-v7\u002F05.error-handling-404",{"title":5219,"path":5220,"stem":5221},"Data Router API: альтернативний синтаксис через createBrowserRouter","\u002Freact-typescript\u002Freact-router-v7\u002Fdata-router-api-examples","22.react-typescript\u002F33.react-router-v7\u002F06.data-router-api-examples",{"title":5223,"path":5224,"stem":5225},"Axios: HTTP-клієнт із розширеними можливостями","\u002Freact-typescript\u002Faxios","22.react-typescript\u002F34.axios",{"title":5227,"path":5228,"stem":5229},"Redux: класичний підхід до глобального стану","\u002Freact-typescript\u002Fredux-classic","22.react-typescript\u002F35.redux-classic",{"title":5231,"path":5232,"stem":5233},"Redux Toolkit: сучасний стандарт Redux","\u002Freact-typescript\u002Fredux-toolkit","22.react-typescript\u002F36.redux-toolkit",{"title":5235,"path":5236,"stem":5237},"RTK Query: запити до сервера без болю","\u002Freact-typescript\u002Frtk-query-tanstack-query","22.react-typescript\u002F38.rtk-query-tanstack-query",{"title":5239,"path":5240,"stem":5241},"React Hook Form + Zod: типобезпечна валідація форм","\u002Freact-typescript\u002Freact-hook-form-zod","22.react-typescript\u002F39.react-hook-form-zod",{"title":5243,"path":5244,"stem":5245},"Тестування компонентів діаграм та пісочниць","\u002Ftest-components","98.test-components",{"id":5247,"title":2013,"body":5248,"description":19974,"extension":19975,"links":19976,"meta":19977,"navigation":5320,"path":2014,"seo":19978,"stem":2015,"__hash__":19979},"docs\u002F02.cpp\u002F75.virtual-functions-polymorphism.md",{"type":5249,"value":5250,"toc":19898},"minimark",[5251,5256,5284,5734,5760,5769,5799,5825,5924,5928,5933,5956,5970,6404,6419,6447,6454,6458,6472,6582,6600,6620,6624,6628,6640,7051,7080,7103,7107,7133,7151,7164,7277,7281,7284,7299,7302,7309,7313,7324,7475,7497,7508,7512,7515,7816,7827,7846,7866,7881,7885,7889,7920,7923,7938,7945,8118,8137,8141,8147,8333,8343,8357,8366,8370,8374,8377,8630,8633,8637,8647,9259,9286,9293,9308,9312,9322,9595,9598,9602,9606,9619,9633,9640,9834,9857,9869,9873,9876,9977,9992,9998,10002,10006,10019,10155,10170,10219,10223,10235,10438,10458,10487,10491,10495,10498,10728,10743,10754,10768,10772,10775,10795,10820,10833,10844,10847,10851,10855,10858,10904,10909,10913,10920,10925,10936,10941,10955,10965,10969,10972,10996,11001,11023,11035,11145,11149,11153,11156,11367,11373,11415,11437,11441,11450,11472,11481,11516,11527,11902,11906,11910,11924,12220,12223,12286,12293,12315,12321,12325,12328,12614,12625,12643,12647,12651,12654,14217,14269,14286,14311,14318,14322,14328,14547,14554,14585,14588,14603,14607,14613,14649,14655,14961,14965,14969,14974,14977,15012,15018,15022,15025,15030,15117,15124,15129,15208,15211,15216,15223,15229,15233,15237,15247,16157,16176,16202,16221,16225,16235,17233,17255,17276,17280,17284,17451,17460,17464,17554,17562,17566,17740,17756,17764,17768,17959,17968,17972,18067,18071,18231,18234,18238,18241,18287,18290,19894],[5252,5253,5255],"h2",{"id":5254},"парадокс-покажчиків-коли-собака-втратив-свій-гавкіт","Парадокс покажчиків: коли собака втратив свій гавкіт",[5257,5258,5259,5260,5264,5265,5268,5269,5272,5273,5276,5277,5280,5281,5283],"p",{},"Припустимо, ми реалізували ієрархію класів для моделювання тварин: базовий клас ",[5261,5262,5263],"code",{},"Animal"," та два похідні класи ",[5261,5266,5267],{},"Cat"," і ",[5261,5270,5271],{},"Dog",". Кожна тварина має метод ",[5261,5274,5275],{},"speak()",", який повертає характерний для неї звук. Ми написали функцію ",[5261,5278,5279],{},"report()",", що приймає посилання на ",[5261,5282,5263],{}," та виводить ім'я і звук тварини:",[5285,5286,5292],"pre",{"className":5287,"code":5288,"filename":5289,"language":5290,"meta":5291,"style":5291},"language-cpp shiki shiki-themes light-plus dark-plus dark-plus","#include \u003Ciostream>\n#include \u003Cstring>\n\nclass Animal\n{\nprotected:\n    std::string name;\n\npublic:\n    Animal(std::string n) : name(n) {}\n    \n    std::string getName() const { return name; }\n    const char* speak() const { return \"???\"; }\n};\n\nclass Dog : public Animal\n{\npublic:\n    Dog(std::string n) : Animal(n) {}\n    \n    const char* speak() const { return \"Woof\"; }\n};\n\nvoid report(const Animal& animal)\n{\n    std::cout \u003C\u003C animal.getName() \u003C\u003C \" каже \" \u003C\u003C animal.speak() \u003C\u003C \"\\n\";\n}\n\nint main()\n{\n    Dog barsik(\"Барсик\");\n    report(barsik);  \u002F\u002F Очікуємо: Барсик каже Woof\n    \n    return 0;\n}\n","AnimalReport.cpp","cpp","",[5261,5293,5294,5307,5315,5322,5333,5340,5346,5365,5370,5376,5410,5416,5445,5470,5476,5481,5497,5502,5507,5533,5538,5560,5565,5570,5595,5600,5650,5656,5661,5673,5678,5694,5712,5717,5729],{"__ignoreMap":5291},[5295,5296,5299,5303],"span",{"class":5297,"line":5298},"line",1,[5295,5300,5302],{"class":5301},"s8xlr","#include",[5295,5304,5306],{"class":5305},"sbdoH"," \u003Ciostream>\n",[5295,5308,5310,5312],{"class":5297,"line":5309},2,[5295,5311,5302],{"class":5301},[5295,5313,5314],{"class":5305}," \u003Cstring>\n",[5295,5316,5318],{"class":5297,"line":5317},3,[5295,5319,5321],{"emptyLinePlaceholder":5320},true,"\n",[5295,5323,5325,5329],{"class":5297,"line":5324},4,[5295,5326,5328],{"class":5327},"su1O8","class",[5295,5330,5332],{"class":5331},"sN1BT"," Animal\n",[5295,5334,5336],{"class":5297,"line":5335},5,[5295,5337,5339],{"class":5338},"sHH4Y","{\n",[5295,5341,5343],{"class":5297,"line":5342},6,[5295,5344,5345],{"class":5327},"protected:\n",[5295,5347,5349,5352,5355,5358,5362],{"class":5297,"line":5348},7,[5295,5350,5351],{"class":5331},"    std",[5295,5353,5354],{"class":5338},"::",[5295,5356,5357],{"class":5331},"string",[5295,5359,5361],{"class":5360},"siwwj"," name",[5295,5363,5364],{"class":5338},";\n",[5295,5366,5368],{"class":5297,"line":5367},8,[5295,5369,5321],{"emptyLinePlaceholder":5320},[5295,5371,5373],{"class":5297,"line":5372},9,[5295,5374,5375],{"class":5327},"public:\n",[5295,5377,5379,5383,5386,5389,5391,5393,5396,5399,5402,5404,5407],{"class":5297,"line":5378},10,[5295,5380,5382],{"class":5381},"s8Opu","    Animal",[5295,5384,5385],{"class":5338},"(",[5295,5387,5388],{"class":5331},"std",[5295,5390,5354],{"class":5338},[5295,5392,5357],{"class":5331},[5295,5394,5395],{"class":5360}," n",[5295,5397,5398],{"class":5338},") : ",[5295,5400,5401],{"class":5381},"name",[5295,5403,5385],{"class":5338},[5295,5405,5406],{"class":5360},"n",[5295,5408,5409],{"class":5338},") {}\n",[5295,5411,5413],{"class":5297,"line":5412},11,[5295,5414,5415],{"class":5338},"    \n",[5295,5417,5419,5421,5423,5425,5428,5431,5434,5437,5440,5442],{"class":5297,"line":5418},12,[5295,5420,5351],{"class":5331},[5295,5422,5354],{"class":5338},[5295,5424,5357],{"class":5331},[5295,5426,5427],{"class":5381}," getName",[5295,5429,5430],{"class":5338},"() ",[5295,5432,5433],{"class":5327},"const",[5295,5435,5436],{"class":5338}," { ",[5295,5438,5439],{"class":5301},"return",[5295,5441,5361],{"class":5360},[5295,5443,5444],{"class":5338},"; }\n",[5295,5446,5448,5451,5454,5457,5459,5461,5463,5465,5468],{"class":5297,"line":5447},13,[5295,5449,5450],{"class":5327},"    const",[5295,5452,5453],{"class":5327}," char*",[5295,5455,5456],{"class":5381}," speak",[5295,5458,5430],{"class":5338},[5295,5460,5433],{"class":5327},[5295,5462,5436],{"class":5338},[5295,5464,5439],{"class":5301},[5295,5466,5467],{"class":5305}," \"???\"",[5295,5469,5444],{"class":5338},[5295,5471,5473],{"class":5297,"line":5472},14,[5295,5474,5475],{"class":5338},"};\n",[5295,5477,5479],{"class":5297,"line":5478},15,[5295,5480,5321],{"emptyLinePlaceholder":5320},[5295,5482,5484,5486,5489,5492,5495],{"class":5297,"line":5483},16,[5295,5485,5328],{"class":5327},[5295,5487,5488],{"class":5331}," Dog",[5295,5490,5491],{"class":5338}," : ",[5295,5493,5494],{"class":5327},"public",[5295,5496,5332],{"class":5331},[5295,5498,5500],{"class":5297,"line":5499},17,[5295,5501,5339],{"class":5338},[5295,5503,5505],{"class":5297,"line":5504},18,[5295,5506,5375],{"class":5327},[5295,5508,5510,5513,5515,5517,5519,5521,5523,5525,5527,5529,5531],{"class":5297,"line":5509},19,[5295,5511,5512],{"class":5381},"    Dog",[5295,5514,5385],{"class":5338},[5295,5516,5388],{"class":5331},[5295,5518,5354],{"class":5338},[5295,5520,5357],{"class":5331},[5295,5522,5395],{"class":5360},[5295,5524,5398],{"class":5338},[5295,5526,5263],{"class":5381},[5295,5528,5385],{"class":5338},[5295,5530,5406],{"class":5360},[5295,5532,5409],{"class":5338},[5295,5534,5536],{"class":5297,"line":5535},20,[5295,5537,5415],{"class":5338},[5295,5539,5541,5543,5545,5547,5549,5551,5553,5555,5558],{"class":5297,"line":5540},21,[5295,5542,5450],{"class":5327},[5295,5544,5453],{"class":5327},[5295,5546,5456],{"class":5381},[5295,5548,5430],{"class":5338},[5295,5550,5433],{"class":5327},[5295,5552,5436],{"class":5338},[5295,5554,5439],{"class":5301},[5295,5556,5557],{"class":5305}," \"Woof\"",[5295,5559,5444],{"class":5338},[5295,5561,5563],{"class":5297,"line":5562},22,[5295,5564,5475],{"class":5338},[5295,5566,5568],{"class":5297,"line":5567},23,[5295,5569,5321],{"emptyLinePlaceholder":5320},[5295,5571,5573,5576,5579,5581,5583,5586,5589,5592],{"class":5297,"line":5572},24,[5295,5574,5575],{"class":5327},"void",[5295,5577,5578],{"class":5381}," report",[5295,5580,5385],{"class":5338},[5295,5582,5433],{"class":5327},[5295,5584,5585],{"class":5331}," Animal",[5295,5587,5588],{"class":5327},"&",[5295,5590,5591],{"class":5360}," animal",[5295,5593,5594],{"class":5338},")\n",[5295,5596,5598],{"class":5297,"line":5597},25,[5295,5599,5339],{"class":5338},[5295,5601,5603,5605,5607,5610,5613,5616,5619,5622,5625,5628,5630,5632,5634,5637,5639,5642,5646,5648],{"class":5297,"line":5602},26,[5295,5604,5351],{"class":5331},[5295,5606,5354],{"class":5338},[5295,5608,5609],{"class":5360},"cout",[5295,5611,5612],{"class":5338}," \u003C\u003C ",[5295,5614,5615],{"class":5360},"animal",[5295,5617,5618],{"class":5338},".",[5295,5620,5621],{"class":5381},"getName",[5295,5623,5624],{"class":5338},"() \u003C\u003C ",[5295,5626,5627],{"class":5305},"\" каже \"",[5295,5629,5612],{"class":5338},[5295,5631,5615],{"class":5360},[5295,5633,5618],{"class":5338},[5295,5635,5636],{"class":5381},"speak",[5295,5638,5624],{"class":5338},[5295,5640,5641],{"class":5305},"\"",[5295,5643,5645],{"class":5644},"sjcCO","\\n",[5295,5647,5641],{"class":5305},[5295,5649,5364],{"class":5338},[5295,5651,5653],{"class":5297,"line":5652},27,[5295,5654,5655],{"class":5338},"}\n",[5295,5657,5659],{"class":5297,"line":5658},28,[5295,5660,5321],{"emptyLinePlaceholder":5320},[5295,5662,5664,5667,5670],{"class":5297,"line":5663},29,[5295,5665,5666],{"class":5327},"int",[5295,5668,5669],{"class":5381}," main",[5295,5671,5672],{"class":5338},"()\n",[5295,5674,5676],{"class":5297,"line":5675},30,[5295,5677,5339],{"class":5338},[5295,5679,5681,5683,5686,5688,5691],{"class":5297,"line":5680},31,[5295,5682,5512],{"class":5331},[5295,5684,5685],{"class":5381}," barsik",[5295,5687,5385],{"class":5338},[5295,5689,5690],{"class":5305},"\"Барсик\"",[5295,5692,5693],{"class":5338},");\n",[5295,5695,5697,5700,5702,5705,5708],{"class":5297,"line":5696},32,[5295,5698,5699],{"class":5381},"    report",[5295,5701,5385],{"class":5338},[5295,5703,5704],{"class":5360},"barsik",[5295,5706,5707],{"class":5338},");",[5295,5709,5711],{"class":5710},"spJ8K","  \u002F\u002F Очікуємо: Барсик каже Woof\n",[5295,5713,5715],{"class":5297,"line":5714},33,[5295,5716,5415],{"class":5338},[5295,5718,5720,5723,5727],{"class":5297,"line":5719},34,[5295,5721,5722],{"class":5301},"    return",[5295,5724,5726],{"class":5725},"sJj4R"," 0",[5295,5728,5364],{"class":5338},[5295,5730,5732],{"class":5297,"line":5731},35,[5295,5733,5655],{"class":5338},[5257,5735,5736,5737,5740,5741,5745,5746,5748,5749,5751,5752,5755,5756,5759],{},"Інтуїтивно ми очікуємо, що виклик ",[5261,5738,5739],{},"report(barsik)"," виведе ",[5742,5743,5744],"strong",{},"«Барсик каже Woof»",", адже ",[5261,5747,5704],{}," — це об'єкт класу ",[5261,5750,5271],{},", а метод ",[5261,5753,5754],{},"Dog::speak()"," повертає ",[5261,5757,5758],{},"\"Woof\"",". Проте результат виконання програми вас здивує:",[5761,5762,5764],"terminal-preview",{"title":5763},".\u002FAnimalReport",[5765,5766,5768],"div",{"className":5767},[5297],"Барсик каже ???",[5257,5770,5771,5772,5775,5776,5778,5779,5781,5782,5784,5785,5788,5789,5792,5793,5796,5797,5618],{},"Замість гавкоту собаки програма друкує невиразний базовий звук ",[5261,5773,5774],{},"\"???\"",". Чому так сталося? Об'єкт ",[5261,5777,5704],{}," є екземпляром класу ",[5261,5780,5271],{},", він «знає», що має гавкати — але функція ",[5261,5783,5279],{}," приймає параметр типу ",[5261,5786,5787],{},"const Animal&",", і компілятор викликає ",[5742,5790,5791],{},"саме"," ",[5261,5794,5795],{},"Animal::speak()",", ігноруючи існування ",[5261,5798,5754],{},[5257,5800,5801,5802,5805,5806,5810,5811,5805,5814,5817,5818,5805,5821,5824],{},"Це фундаментальна проблема, з якою стикаються всі розробники при переході від процедурного програмування до об'єктно-орієнтованого. У цій статті ми дослідимо ",[5742,5803,5804],{},"статичне зв'язування"," (",[5807,5808,5809],"em",{},"static binding","), дізнаємося, чому покажчики та посилання на базовий клас за замовчуванням викликають методи базового класу, і навчимося вирішувати цю проблему за допомогою ",[5742,5812,5813],{},"віртуальних функцій",[5807,5815,5816],{},"virtual functions",") — механізму, що реалізує третій фундаментальний принцип ООП: ",[5742,5819,5820],{},"поліморфізм",[5807,5822,5823],{},"polymorphism",").",[5826,5827,5828,5863],"card-group",{},[5829,5830,5833],"card",{"icon":5831,"title":5832},"i-lucide-target","🎯 Мета статті",[5834,5835,5836,5840,5847,5854,5857,5860],"ul",{},[5837,5838,5839],"li",{},"Зрозуміти поведінку покажчиків та посилань на базовий клас, що адресують об'єкти похідних класів",[5837,5841,5842,5843,5846],{},"Пояснити обмеження раннього (статичного) зв'язування: чому виклик ",[5261,5844,5845],{},"basePtr->speak()"," викликає метод базового класу",[5837,5848,5849,5850,5853],{},"Ввести ключове слово ",[5261,5851,5852],{},"virtual"," для активації динамічного (runtime) поліморфізму",[5837,5855,5856],{},"Сформулювати третій стовп ООП — поліморфізм: єдиний інтерфейс для різноманітної поведінки об'єктів",[5837,5858,5859],{},"Навчитися обробляти гетерогенні колекції через масиви покажчиків на базовий клас",[5837,5861,5862],{},"Розібрати поняття коваріантних типів повернення",[5829,5864,5866],{"icon":4634,"title":5865},"🔑 Ключові терміни",[5834,5867,5868,5876,5888,5897,5906,5915],{},[5837,5869,5870,5805,5873,5875],{},[5742,5871,5872],{},"Поліморфізм",[5807,5874,5823],{},"): здатність об'єктів різних типів реагувати на одне й те саме повідомлення (виклик методу) різними способами",[5837,5877,5878,5805,5881,5884,5885,5887],{},[5742,5879,5880],{},"Віртуальна функція",[5807,5882,5883],{},"virtual function","): метод базового класу, позначений ключовим словом ",[5261,5886,5852],{},", який дозволяє похідним класам змінити його поведінку",[5837,5889,5890,5805,5893,5896],{},[5742,5891,5892],{},"Статичне зв'язування",[5807,5894,5895],{},"static \u002F early binding","): вибір методу для виклику відбувається під час компіляції на основі типу покажчика\u002Fпосилання",[5837,5898,5899,5805,5902,5905],{},[5742,5900,5901],{},"Динамічне зв'язування",[5807,5903,5904],{},"dynamic \u002F late binding","): вибір методу відбувається під час виконання на основі реального типу об'єкта в пам'яті",[5837,5907,5908,5805,5911,5914],{},[5742,5909,5910],{},"Перевизначення",[5807,5912,5913],{},"override","): заміна реалізації віртуального методу базового класу новою реалізацією в похідному класі",[5837,5916,5917,5805,5920,5923],{},[5742,5918,5919],{},"Коваріантний тип повернення",[5807,5921,5922],{},"covariant return type","): можливість перевизначеного методу повертати покажчик або посилання на похідний клас замість базового",[5252,5925,5927],{"id":5926},"покажчики-та-посилання-на-базовий-клас-сумісність-за-наслідуванням","Покажчики та посилання на базовий клас: сумісність за наслідуванням",[5929,5930,5932],"h3",{"id":5931},"природність-неявного-перетворення","Природність неявного перетворення",[5257,5934,5935,5936,5805,5939,5942,5943,5946,5947,5949,5950,5952,5953,5955],{},"У попередньому розділі ми вивчили, що похідний клас успадковує структуру та поведінку базового класу через відношення ",[5742,5937,5938],{},"«є різновидом»",[5807,5940,5941],{},"is-a","). Це означає, що об'єкт похідного класу ",[5742,5944,5945],{},"містить всередині себе"," повноцінну частину базового класу. При створенні об'єкта ",[5261,5948,5271],{}," компілятор спочатку конструює частину ",[5261,5951,5263],{},", а потім додає специфічні для ",[5261,5954,5271],{}," поля та методи.",[5257,5957,5958,5959,5962,5963,5805,5966,5969],{},"З цієї властивості випливає важливий висновок: ",[5742,5960,5961],{},"покажчик або посилання на базовий клас може адресувати об'єкт похідного класу",". Таке неявне перетворення називається ",[5742,5964,5965],{},"висхідним приведенням типів",[5807,5967,5968],{},"upcasting",") — ми піднімаємося вгору по ієрархії класів:",[5285,5971,5974],{"className":5287,"code":5972,"filename":5973,"language":5290,"meta":5291,"style":5291},"#include \u003Ciostream>\n\nclass Animal\n{\nprotected:\n    std::string name;\n\npublic:\n    Animal(std::string n) : name(n) {}\n    \n    std::string getName() const { return name; }\n    const char* speak() const { return \"???\"; }\n};\n\nclass Dog : public Animal\n{\npublic:\n    Dog(std::string n) : Animal(n) {}\n    \n    const char* speak() const { return \"Woof\"; }\n    void fetch() { std::cout \u003C\u003C \"Біжу за м'ячем!\\n\"; }\n};\n\nint main()\n{\n    Dog barsik(\"Барсик\");\n    \n    \u002F\u002F Покажчик на базовий клас адресує об'єкт похідного класу\n    Animal* ptrAnimal = &barsik;  \u002F\u002F ✅ Upcasting — завжди безпечний\n    \n    \u002F\u002F Посилання на базовий клас адресує об'єкт похідного класу\n    Animal& refAnimal = barsik;   \u002F\u002F ✅ Upcasting через посилання\n    \n    std::cout \u003C\u003C \"barsik.getName() = \" \u003C\u003C barsik.getName() \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C \"ptrAnimal->getName() = \" \u003C\u003C ptrAnimal->getName() \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C \"refAnimal.getName() = \" \u003C\u003C refAnimal.getName() \u003C\u003C \"\\n\";\n    \n    return 0;\n}\n","Upcasting.cpp",[5261,5975,5976,5982,5986,5992,5996,6000,6012,6016,6020,6044,6048,6070,6090,6094,6098,6110,6114,6118,6142,6146,6166,6194,6198,6202,6210,6214,6226,6230,6235,6256,6260,6265,6284,6288,6319,6352,6385,6390,6399],{"__ignoreMap":5291},[5295,5977,5978,5980],{"class":5297,"line":5298},[5295,5979,5302],{"class":5301},[5295,5981,5306],{"class":5305},[5295,5983,5984],{"class":5297,"line":5309},[5295,5985,5321],{"emptyLinePlaceholder":5320},[5295,5987,5988,5990],{"class":5297,"line":5317},[5295,5989,5328],{"class":5327},[5295,5991,5332],{"class":5331},[5295,5993,5994],{"class":5297,"line":5324},[5295,5995,5339],{"class":5338},[5295,5997,5998],{"class":5297,"line":5335},[5295,5999,5345],{"class":5327},[5295,6001,6002,6004,6006,6008,6010],{"class":5297,"line":5342},[5295,6003,5351],{"class":5331},[5295,6005,5354],{"class":5338},[5295,6007,5357],{"class":5331},[5295,6009,5361],{"class":5360},[5295,6011,5364],{"class":5338},[5295,6013,6014],{"class":5297,"line":5348},[5295,6015,5321],{"emptyLinePlaceholder":5320},[5295,6017,6018],{"class":5297,"line":5367},[5295,6019,5375],{"class":5327},[5295,6021,6022,6024,6026,6028,6030,6032,6034,6036,6038,6040,6042],{"class":5297,"line":5372},[5295,6023,5382],{"class":5381},[5295,6025,5385],{"class":5338},[5295,6027,5388],{"class":5331},[5295,6029,5354],{"class":5338},[5295,6031,5357],{"class":5331},[5295,6033,5395],{"class":5360},[5295,6035,5398],{"class":5338},[5295,6037,5401],{"class":5381},[5295,6039,5385],{"class":5338},[5295,6041,5406],{"class":5360},[5295,6043,5409],{"class":5338},[5295,6045,6046],{"class":5297,"line":5378},[5295,6047,5415],{"class":5338},[5295,6049,6050,6052,6054,6056,6058,6060,6062,6064,6066,6068],{"class":5297,"line":5412},[5295,6051,5351],{"class":5331},[5295,6053,5354],{"class":5338},[5295,6055,5357],{"class":5331},[5295,6057,5427],{"class":5381},[5295,6059,5430],{"class":5338},[5295,6061,5433],{"class":5327},[5295,6063,5436],{"class":5338},[5295,6065,5439],{"class":5301},[5295,6067,5361],{"class":5360},[5295,6069,5444],{"class":5338},[5295,6071,6072,6074,6076,6078,6080,6082,6084,6086,6088],{"class":5297,"line":5418},[5295,6073,5450],{"class":5327},[5295,6075,5453],{"class":5327},[5295,6077,5456],{"class":5381},[5295,6079,5430],{"class":5338},[5295,6081,5433],{"class":5327},[5295,6083,5436],{"class":5338},[5295,6085,5439],{"class":5301},[5295,6087,5467],{"class":5305},[5295,6089,5444],{"class":5338},[5295,6091,6092],{"class":5297,"line":5447},[5295,6093,5475],{"class":5338},[5295,6095,6096],{"class":5297,"line":5472},[5295,6097,5321],{"emptyLinePlaceholder":5320},[5295,6099,6100,6102,6104,6106,6108],{"class":5297,"line":5478},[5295,6101,5328],{"class":5327},[5295,6103,5488],{"class":5331},[5295,6105,5491],{"class":5338},[5295,6107,5494],{"class":5327},[5295,6109,5332],{"class":5331},[5295,6111,6112],{"class":5297,"line":5483},[5295,6113,5339],{"class":5338},[5295,6115,6116],{"class":5297,"line":5499},[5295,6117,5375],{"class":5327},[5295,6119,6120,6122,6124,6126,6128,6130,6132,6134,6136,6138,6140],{"class":5297,"line":5504},[5295,6121,5512],{"class":5381},[5295,6123,5385],{"class":5338},[5295,6125,5388],{"class":5331},[5295,6127,5354],{"class":5338},[5295,6129,5357],{"class":5331},[5295,6131,5395],{"class":5360},[5295,6133,5398],{"class":5338},[5295,6135,5263],{"class":5381},[5295,6137,5385],{"class":5338},[5295,6139,5406],{"class":5360},[5295,6141,5409],{"class":5338},[5295,6143,6144],{"class":5297,"line":5509},[5295,6145,5415],{"class":5338},[5295,6147,6148,6150,6152,6154,6156,6158,6160,6162,6164],{"class":5297,"line":5535},[5295,6149,5450],{"class":5327},[5295,6151,5453],{"class":5327},[5295,6153,5456],{"class":5381},[5295,6155,5430],{"class":5338},[5295,6157,5433],{"class":5327},[5295,6159,5436],{"class":5338},[5295,6161,5439],{"class":5301},[5295,6163,5557],{"class":5305},[5295,6165,5444],{"class":5338},[5295,6167,6168,6171,6174,6177,6179,6181,6183,6185,6188,6190,6192],{"class":5297,"line":5540},[5295,6169,6170],{"class":5327},"    void",[5295,6172,6173],{"class":5381}," fetch",[5295,6175,6176],{"class":5338},"() { ",[5295,6178,5388],{"class":5331},[5295,6180,5354],{"class":5338},[5295,6182,5609],{"class":5360},[5295,6184,5612],{"class":5338},[5295,6186,6187],{"class":5305},"\"Біжу за м'ячем!",[5295,6189,5645],{"class":5644},[5295,6191,5641],{"class":5305},[5295,6193,5444],{"class":5338},[5295,6195,6196],{"class":5297,"line":5562},[5295,6197,5475],{"class":5338},[5295,6199,6200],{"class":5297,"line":5567},[5295,6201,5321],{"emptyLinePlaceholder":5320},[5295,6203,6204,6206,6208],{"class":5297,"line":5572},[5295,6205,5666],{"class":5327},[5295,6207,5669],{"class":5381},[5295,6209,5672],{"class":5338},[5295,6211,6212],{"class":5297,"line":5597},[5295,6213,5339],{"class":5338},[5295,6215,6216,6218,6220,6222,6224],{"class":5297,"line":5602},[5295,6217,5512],{"class":5331},[5295,6219,5685],{"class":5381},[5295,6221,5385],{"class":5338},[5295,6223,5690],{"class":5305},[5295,6225,5693],{"class":5338},[5295,6227,6228],{"class":5297,"line":5652},[5295,6229,5415],{"class":5338},[5295,6231,6232],{"class":5297,"line":5658},[5295,6233,6234],{"class":5710},"    \u002F\u002F Покажчик на базовий клас адресує об'єкт похідного класу\n",[5295,6236,6237,6239,6242,6245,6248,6250,6253],{"class":5297,"line":5663},[5295,6238,5382],{"class":5331},[5295,6240,6241],{"class":5327},"*",[5295,6243,6244],{"class":5360}," ptrAnimal",[5295,6246,6247],{"class":5338}," = &",[5295,6249,5704],{"class":5360},[5295,6251,6252],{"class":5338},";",[5295,6254,6255],{"class":5710},"  \u002F\u002F ✅ Upcasting — завжди безпечний\n",[5295,6257,6258],{"class":5297,"line":5675},[5295,6259,5415],{"class":5338},[5295,6261,6262],{"class":5297,"line":5680},[5295,6263,6264],{"class":5710},"    \u002F\u002F Посилання на базовий клас адресує об'єкт похідного класу\n",[5295,6266,6267,6269,6271,6274,6277,6279,6281],{"class":5297,"line":5696},[5295,6268,5382],{"class":5331},[5295,6270,5588],{"class":5327},[5295,6272,6273],{"class":5360}," refAnimal",[5295,6275,6276],{"class":5338}," = ",[5295,6278,5704],{"class":5360},[5295,6280,6252],{"class":5338},[5295,6282,6283],{"class":5710},"   \u002F\u002F ✅ Upcasting через посилання\n",[5295,6285,6286],{"class":5297,"line":5714},[5295,6287,5415],{"class":5338},[5295,6289,6290,6292,6294,6296,6298,6301,6303,6305,6307,6309,6311,6313,6315,6317],{"class":5297,"line":5719},[5295,6291,5351],{"class":5331},[5295,6293,5354],{"class":5338},[5295,6295,5609],{"class":5360},[5295,6297,5612],{"class":5338},[5295,6299,6300],{"class":5305},"\"barsik.getName() = \"",[5295,6302,5612],{"class":5338},[5295,6304,5704],{"class":5360},[5295,6306,5618],{"class":5338},[5295,6308,5621],{"class":5381},[5295,6310,5624],{"class":5338},[5295,6312,5641],{"class":5305},[5295,6314,5645],{"class":5644},[5295,6316,5641],{"class":5305},[5295,6318,5364],{"class":5338},[5295,6320,6321,6323,6325,6327,6329,6332,6334,6337,6340,6342,6344,6346,6348,6350],{"class":5297,"line":5731},[5295,6322,5351],{"class":5331},[5295,6324,5354],{"class":5338},[5295,6326,5609],{"class":5360},[5295,6328,5612],{"class":5338},[5295,6330,6331],{"class":5305},"\"ptrAnimal->getName() = \"",[5295,6333,5612],{"class":5338},[5295,6335,6336],{"class":5360},"ptrAnimal",[5295,6338,6339],{"class":5338},"->",[5295,6341,5621],{"class":5381},[5295,6343,5624],{"class":5338},[5295,6345,5641],{"class":5305},[5295,6347,5645],{"class":5644},[5295,6349,5641],{"class":5305},[5295,6351,5364],{"class":5338},[5295,6353,6355,6357,6359,6361,6363,6366,6368,6371,6373,6375,6377,6379,6381,6383],{"class":5297,"line":6354},36,[5295,6356,5351],{"class":5331},[5295,6358,5354],{"class":5338},[5295,6360,5609],{"class":5360},[5295,6362,5612],{"class":5338},[5295,6364,6365],{"class":5305},"\"refAnimal.getName() = \"",[5295,6367,5612],{"class":5338},[5295,6369,6370],{"class":5360},"refAnimal",[5295,6372,5618],{"class":5338},[5295,6374,5621],{"class":5381},[5295,6376,5624],{"class":5338},[5295,6378,5641],{"class":5305},[5295,6380,5645],{"class":5644},[5295,6382,5641],{"class":5305},[5295,6384,5364],{"class":5338},[5295,6386,6388],{"class":5297,"line":6387},37,[5295,6389,5415],{"class":5338},[5295,6391,6393,6395,6397],{"class":5297,"line":6392},38,[5295,6394,5722],{"class":5301},[5295,6396,5726],{"class":5725},[5295,6398,5364],{"class":5338},[5295,6400,6402],{"class":5297,"line":6401},39,[5295,6403,5655],{"class":5338},[5761,6405,6407,6411,6415],{"title":6406},".\u002FUpcasting",[5765,6408,6410],{"className":6409},[5297],"barsik.getName() = Барсик",[5765,6412,6414],{"className":6413},[5297],"ptrAnimal->getName() = Барсик",[5765,6416,6418],{"className":6417},[5297],"refAnimal.getName() = Барсік",[5257,6420,6421,6422,5792,6424,5792,6427,6429,6430,6432,6433,6435,6436,6438,6439,6441,6442,6444,6445,5618],{},"Компілятор безпечно дозволяє таке присвоєння, адже ",[5261,6423,5271],{},[5742,6425,6426],{},"є",[5261,6428,5263],{}," — об'єкт ",[5261,6431,5704],{}," гарантовано містить усі поля та методи класу ",[5261,6434,5263],{},". Покажчик ",[5261,6437,6336],{}," та посилання ",[5261,6440,6370],{}," адресують частину ",[5261,6443,5263],{}," всередині об'єкта ",[5261,6446,5704],{},[6448,6449,6450,6453],"note",{},[5742,6451,6452],{},"Upcasting завжди безпечний і неявний",": компілятор автоматично дозволяє присвоювати адресу об'єкта похідного класу покажчику на базовий клас. Не потрібно явного приведення типів. Це природне перетворення, яке відображає семантику наслідування.",[5929,6455,6457],{"id":6456},"обмеження-видимості-покажчик-бачить-лише-інтерфейс-базового-класу","Обмеження видимості: покажчик бачить лише інтерфейс базового класу",[5257,6459,6460,6461,6464,6465,6468,6469,6471],{},"Проте таке перетворення має важливе обмеження: ",[5742,6462,6463],{},"покажчик або посилання на базовий клас може викликати лише ті методи, які оголошені в базовому класі",". Компілятор розглядає тип покажчика (",[5261,6466,6467],{},"Animal*","), а не реальний тип об'єкта в пам'яті (",[5261,6470,5271],{},"):",[5285,6473,6477],{"className":5287,"code":6474,"filename":6475,"highlights":6476,"language":5290,"meta":5291,"style":5291},"int main()\n{\n    Dog barsik(\"Барсик\");\n    Animal* ptrAnimal = &barsik;\n    \n    ptrAnimal->getName();   \u002F\u002F ✅ Animal::getName() існує\n    ptrAnimal->speak();     \u002F\u002F ✅ Animal::speak() існує\n    \n    \u002F\u002F ptrAnimal->fetch();  \u002F\u002F ❌ Помилка компіляції: fetch() не оголошено в Animal\n    \n    return 0;\n}\n","VisibilityLimit.cpp",[5342,5348,5367,5372],[5261,6478,6479,6487,6491,6503,6517,6521,6538,6552,6557,6566,6570,6578],{"__ignoreMap":5291},[5295,6480,6481,6483,6485],{"class":5297,"line":5298},[5295,6482,5666],{"class":5327},[5295,6484,5669],{"class":5381},[5295,6486,5672],{"class":5338},[5295,6488,6489],{"class":5297,"line":5309},[5295,6490,5339],{"class":5338},[5295,6492,6493,6495,6497,6499,6501],{"class":5297,"line":5317},[5295,6494,5512],{"class":5331},[5295,6496,5685],{"class":5381},[5295,6498,5385],{"class":5338},[5295,6500,5690],{"class":5305},[5295,6502,5693],{"class":5338},[5295,6504,6505,6507,6509,6511,6513,6515],{"class":5297,"line":5324},[5295,6506,5382],{"class":5331},[5295,6508,6241],{"class":5327},[5295,6510,6244],{"class":5360},[5295,6512,6247],{"class":5338},[5295,6514,5704],{"class":5360},[5295,6516,5364],{"class":5338},[5295,6518,6519],{"class":5297,"line":5335},[5295,6520,5415],{"class":5338},[5295,6522,6525,6528,6530,6532,6535],{"class":6523,"line":5342},[5297,6524],"highlight",[5295,6526,6527],{"class":5360},"    ptrAnimal",[5295,6529,6339],{"class":5338},[5295,6531,5621],{"class":5381},[5295,6533,6534],{"class":5338},"();",[5295,6536,6537],{"class":5710},"   \u002F\u002F ✅ Animal::getName() існує\n",[5295,6539,6541,6543,6545,6547,6549],{"class":6540,"line":5348},[5297,6524],[5295,6542,6527],{"class":5360},[5295,6544,6339],{"class":5338},[5295,6546,5636],{"class":5381},[5295,6548,6534],{"class":5338},[5295,6550,6551],{"class":5710},"     \u002F\u002F ✅ Animal::speak() існує\n",[5295,6553,6555],{"class":6554,"line":5367},[5297,6524],[5295,6556,5415],{"class":5338},[5295,6558,6560,6563],{"class":6559,"line":5372},[5297,6524],[5295,6561,6562],{"class":5710},"    \u002F\u002F ptrAnimal->fetch();",[5295,6564,6565],{"class":5710},"  \u002F\u002F ❌ Помилка компіляції: fetch() не оголошено в Animal\n",[5295,6567,6568],{"class":5297,"line":5378},[5295,6569,5415],{"class":5338},[5295,6571,6572,6574,6576],{"class":5297,"line":5412},[5295,6573,5722],{"class":5301},[5295,6575,5726],{"class":5725},[5295,6577,5364],{"class":5338},[5295,6579,6580],{"class":5297,"line":5418},[5295,6581,5655],{"class":5338},[5257,6583,6584,6585,6588,6589,6591,6592,6594,6595,6597,6598,5618],{},"Метод ",[5261,6586,6587],{},"fetch()"," існує лише в класі ",[5261,6590,5271],{},", тому покажчик типу ",[5261,6593,6467],{}," не може його викликати — компілятор перевіряє лише оголошення класу ",[5261,6596,5263],{}," і не знаходить там ",[5261,6599,6587],{},[6601,6602,6603,6604,6607,6608,6610,6611,6613,6614,6616,6617,6619],"warning",{},"Покажчик чи посилання на базовий клас обмежені ",[5742,6605,6606],{},"інтерфейсом базового класу",". Вони не мають доступу до методів, доданих у похідних класах. Це обмеження видимості, а не обмеження пам'яті — об'єкт ",[5261,6609,5704],{}," у пам'яті залишається повноцінним ",[5261,6612,5271],{}," з методом ",[5261,6615,6587],{},", але доступ до нього через ",[5261,6618,6467],{}," заборонено на етапі компіляції.",[5252,6621,6623],{"id":6622},"статичне-звязування-коли-компілятор-вирішує-все-заздалегідь","Статичне зв'язування: коли компілятор вирішує все заздалегідь",[5929,6625,6627],{"id":6626},"проблема-викликів-через-покажчики-базового-класу","Проблема викликів через покажчики базового класу",[5257,6629,6630,6631,6633,6634,6636,6637,6639],{},"Тепер розглянемо критичну проблему: що станеться, коли ми викличемо метод ",[5261,6632,5275],{}," через покажчик ",[5261,6635,6467],{},", який адресує об'єкт ",[5261,6638,5271],{},"?",[5285,6641,6644],{"className":5287,"code":6642,"filename":6643,"language":5290,"meta":5291,"style":5291},"#include \u003Ciostream>\n\nclass Animal\n{\npublic:\n    const char* speak() const { return \"???\"; }\n};\n\nclass Cat : public Animal\n{\npublic:\n    const char* speak() const { return \"Meow\"; }\n};\n\nclass Dog : public Animal\n{\npublic:\n    const char* speak() const { return \"Woof\"; }\n};\n\nint main()\n{\n    Cat murka(\"Мурка\");\n    Dog barsik(\"Барсік\");\n    \n    std::cout \u003C\u003C \"Пряме звернення:\\n\";\n    std::cout \u003C\u003C \"  murka.speak() = \" \u003C\u003C murka.speak() \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C \"  barsik.speak() = \" \u003C\u003C barsik.speak() \u003C\u003C \"\\n\\n\";\n    \n    std::cout \u003C\u003C \"Виклик через покажчики базового класу:\\n\";\n    Animal* ptrAnimal = &murka;\n    std::cout \u003C\u003C \"  ptrAnimal->speak() = \" \u003C\u003C ptrAnimal->speak() \u003C\u003C \"\\n\";\n    \n    ptrAnimal = &barsik;\n    std::cout \u003C\u003C \"  ptrAnimal->speak() = \" \u003C\u003C ptrAnimal->speak() \u003C\u003C \"\\n\";\n    \n    return 0;\n}\n","EarlyBindingProblem.cpp",[5261,6645,6646,6652,6656,6662,6666,6670,6690,6694,6698,6711,6715,6719,6740,6744,6748,6760,6764,6768,6788,6792,6796,6804,6808,6823,6836,6840,6859,6891,6923,6927,6946,6960,6991,6995,7005,7035,7039,7047],{"__ignoreMap":5291},[5295,6647,6648,6650],{"class":5297,"line":5298},[5295,6649,5302],{"class":5301},[5295,6651,5306],{"class":5305},[5295,6653,6654],{"class":5297,"line":5309},[5295,6655,5321],{"emptyLinePlaceholder":5320},[5295,6657,6658,6660],{"class":5297,"line":5317},[5295,6659,5328],{"class":5327},[5295,6661,5332],{"class":5331},[5295,6663,6664],{"class":5297,"line":5324},[5295,6665,5339],{"class":5338},[5295,6667,6668],{"class":5297,"line":5335},[5295,6669,5375],{"class":5327},[5295,6671,6672,6674,6676,6678,6680,6682,6684,6686,6688],{"class":5297,"line":5342},[5295,6673,5450],{"class":5327},[5295,6675,5453],{"class":5327},[5295,6677,5456],{"class":5381},[5295,6679,5430],{"class":5338},[5295,6681,5433],{"class":5327},[5295,6683,5436],{"class":5338},[5295,6685,5439],{"class":5301},[5295,6687,5467],{"class":5305},[5295,6689,5444],{"class":5338},[5295,6691,6692],{"class":5297,"line":5348},[5295,6693,5475],{"class":5338},[5295,6695,6696],{"class":5297,"line":5367},[5295,6697,5321],{"emptyLinePlaceholder":5320},[5295,6699,6700,6702,6705,6707,6709],{"class":5297,"line":5372},[5295,6701,5328],{"class":5327},[5295,6703,6704],{"class":5331}," Cat",[5295,6706,5491],{"class":5338},[5295,6708,5494],{"class":5327},[5295,6710,5332],{"class":5331},[5295,6712,6713],{"class":5297,"line":5378},[5295,6714,5339],{"class":5338},[5295,6716,6717],{"class":5297,"line":5412},[5295,6718,5375],{"class":5327},[5295,6720,6721,6723,6725,6727,6729,6731,6733,6735,6738],{"class":5297,"line":5418},[5295,6722,5450],{"class":5327},[5295,6724,5453],{"class":5327},[5295,6726,5456],{"class":5381},[5295,6728,5430],{"class":5338},[5295,6730,5433],{"class":5327},[5295,6732,5436],{"class":5338},[5295,6734,5439],{"class":5301},[5295,6736,6737],{"class":5305}," \"Meow\"",[5295,6739,5444],{"class":5338},[5295,6741,6742],{"class":5297,"line":5447},[5295,6743,5475],{"class":5338},[5295,6745,6746],{"class":5297,"line":5472},[5295,6747,5321],{"emptyLinePlaceholder":5320},[5295,6749,6750,6752,6754,6756,6758],{"class":5297,"line":5478},[5295,6751,5328],{"class":5327},[5295,6753,5488],{"class":5331},[5295,6755,5491],{"class":5338},[5295,6757,5494],{"class":5327},[5295,6759,5332],{"class":5331},[5295,6761,6762],{"class":5297,"line":5483},[5295,6763,5339],{"class":5338},[5295,6765,6766],{"class":5297,"line":5499},[5295,6767,5375],{"class":5327},[5295,6769,6770,6772,6774,6776,6778,6780,6782,6784,6786],{"class":5297,"line":5504},[5295,6771,5450],{"class":5327},[5295,6773,5453],{"class":5327},[5295,6775,5456],{"class":5381},[5295,6777,5430],{"class":5338},[5295,6779,5433],{"class":5327},[5295,6781,5436],{"class":5338},[5295,6783,5439],{"class":5301},[5295,6785,5557],{"class":5305},[5295,6787,5444],{"class":5338},[5295,6789,6790],{"class":5297,"line":5509},[5295,6791,5475],{"class":5338},[5295,6793,6794],{"class":5297,"line":5535},[5295,6795,5321],{"emptyLinePlaceholder":5320},[5295,6797,6798,6800,6802],{"class":5297,"line":5540},[5295,6799,5666],{"class":5327},[5295,6801,5669],{"class":5381},[5295,6803,5672],{"class":5338},[5295,6805,6806],{"class":5297,"line":5562},[5295,6807,5339],{"class":5338},[5295,6809,6810,6813,6816,6818,6821],{"class":5297,"line":5567},[5295,6811,6812],{"class":5331},"    Cat",[5295,6814,6815],{"class":5381}," murka",[5295,6817,5385],{"class":5338},[5295,6819,6820],{"class":5305},"\"Мурка\"",[5295,6822,5693],{"class":5338},[5295,6824,6825,6827,6829,6831,6834],{"class":5297,"line":5572},[5295,6826,5512],{"class":5331},[5295,6828,5685],{"class":5381},[5295,6830,5385],{"class":5338},[5295,6832,6833],{"class":5305},"\"Барсік\"",[5295,6835,5693],{"class":5338},[5295,6837,6838],{"class":5297,"line":5597},[5295,6839,5415],{"class":5338},[5295,6841,6842,6844,6846,6848,6850,6853,6855,6857],{"class":5297,"line":5602},[5295,6843,5351],{"class":5331},[5295,6845,5354],{"class":5338},[5295,6847,5609],{"class":5360},[5295,6849,5612],{"class":5338},[5295,6851,6852],{"class":5305},"\"Пряме звернення:",[5295,6854,5645],{"class":5644},[5295,6856,5641],{"class":5305},[5295,6858,5364],{"class":5338},[5295,6860,6861,6863,6865,6867,6869,6872,6874,6877,6879,6881,6883,6885,6887,6889],{"class":5297,"line":5652},[5295,6862,5351],{"class":5331},[5295,6864,5354],{"class":5338},[5295,6866,5609],{"class":5360},[5295,6868,5612],{"class":5338},[5295,6870,6871],{"class":5305},"\"  murka.speak() = \"",[5295,6873,5612],{"class":5338},[5295,6875,6876],{"class":5360},"murka",[5295,6878,5618],{"class":5338},[5295,6880,5636],{"class":5381},[5295,6882,5624],{"class":5338},[5295,6884,5641],{"class":5305},[5295,6886,5645],{"class":5644},[5295,6888,5641],{"class":5305},[5295,6890,5364],{"class":5338},[5295,6892,6893,6895,6897,6899,6901,6904,6906,6908,6910,6912,6914,6916,6919,6921],{"class":5297,"line":5658},[5295,6894,5351],{"class":5331},[5295,6896,5354],{"class":5338},[5295,6898,5609],{"class":5360},[5295,6900,5612],{"class":5338},[5295,6902,6903],{"class":5305},"\"  barsik.speak() = \"",[5295,6905,5612],{"class":5338},[5295,6907,5704],{"class":5360},[5295,6909,5618],{"class":5338},[5295,6911,5636],{"class":5381},[5295,6913,5624],{"class":5338},[5295,6915,5641],{"class":5305},[5295,6917,6918],{"class":5644},"\\n\\n",[5295,6920,5641],{"class":5305},[5295,6922,5364],{"class":5338},[5295,6924,6925],{"class":5297,"line":5663},[5295,6926,5415],{"class":5338},[5295,6928,6929,6931,6933,6935,6937,6940,6942,6944],{"class":5297,"line":5675},[5295,6930,5351],{"class":5331},[5295,6932,5354],{"class":5338},[5295,6934,5609],{"class":5360},[5295,6936,5612],{"class":5338},[5295,6938,6939],{"class":5305},"\"Виклик через покажчики базового класу:",[5295,6941,5645],{"class":5644},[5295,6943,5641],{"class":5305},[5295,6945,5364],{"class":5338},[5295,6947,6948,6950,6952,6954,6956,6958],{"class":5297,"line":5680},[5295,6949,5382],{"class":5331},[5295,6951,6241],{"class":5327},[5295,6953,6244],{"class":5360},[5295,6955,6247],{"class":5338},[5295,6957,6876],{"class":5360},[5295,6959,5364],{"class":5338},[5295,6961,6962,6964,6966,6968,6970,6973,6975,6977,6979,6981,6983,6985,6987,6989],{"class":5297,"line":5696},[5295,6963,5351],{"class":5331},[5295,6965,5354],{"class":5338},[5295,6967,5609],{"class":5360},[5295,6969,5612],{"class":5338},[5295,6971,6972],{"class":5305},"\"  ptrAnimal->speak() = \"",[5295,6974,5612],{"class":5338},[5295,6976,6336],{"class":5360},[5295,6978,6339],{"class":5338},[5295,6980,5636],{"class":5381},[5295,6982,5624],{"class":5338},[5295,6984,5641],{"class":5305},[5295,6986,5645],{"class":5644},[5295,6988,5641],{"class":5305},[5295,6990,5364],{"class":5338},[5295,6992,6993],{"class":5297,"line":5714},[5295,6994,5415],{"class":5338},[5295,6996,6997,6999,7001,7003],{"class":5297,"line":5719},[5295,6998,6527],{"class":5360},[5295,7000,6247],{"class":5338},[5295,7002,5704],{"class":5360},[5295,7004,5364],{"class":5338},[5295,7006,7007,7009,7011,7013,7015,7017,7019,7021,7023,7025,7027,7029,7031,7033],{"class":5297,"line":5731},[5295,7008,5351],{"class":5331},[5295,7010,5354],{"class":5338},[5295,7012,5609],{"class":5360},[5295,7014,5612],{"class":5338},[5295,7016,6972],{"class":5305},[5295,7018,5612],{"class":5338},[5295,7020,6336],{"class":5360},[5295,7022,6339],{"class":5338},[5295,7024,5636],{"class":5381},[5295,7026,5624],{"class":5338},[5295,7028,5641],{"class":5305},[5295,7030,5645],{"class":5644},[5295,7032,5641],{"class":5305},[5295,7034,5364],{"class":5338},[5295,7036,7037],{"class":5297,"line":6354},[5295,7038,5415],{"class":5338},[5295,7040,7041,7043,7045],{"class":5297,"line":6387},[5295,7042,5722],{"class":5301},[5295,7044,5726],{"class":5725},[5295,7046,5364],{"class":5338},[5295,7048,7049],{"class":5297,"line":6392},[5295,7050,5655],{"class":5338},[5761,7052,7054,7058,7062,7066,7069,7073,7077],{"title":7053},".\u002FEarlyBindingProblem",[5765,7055,7057],{"className":7056},[5297],"Пряме звернення:",[5765,7059,7061],{"className":7060},[5297],"  murka.speak() = Meow",[5765,7063,7065],{"className":7064},[5297],"  barsik.speak() = Woof",[5765,7067],{"className":7068},[5297],[5765,7070,7072],{"className":7071},[5297],"Виклик через покажчики базового класу:",[5765,7074,7076],{"className":7075},[5297],"  ptrAnimal->speak() = ???",[5765,7078,7076],{"className":7079},[5297],[5257,7081,7082,7083,5268,7086,7089,7090,5268,7093,7095,7096,7099,7100,7102],{},"Результат показує фундаментальну проблему: пряме звернення ",[5261,7084,7085],{},"murka.speak()",[5261,7087,7088],{},"barsik.speak()"," правильно викликає методи похідних класів (",[5261,7091,7092],{},"Cat::speak()",[5261,7094,5754],{},"), але виклики через покажчик ",[5261,7097,7098],{},"ptrAnimal->speak()"," завжди виконують ",[5261,7101,5795],{},", незалежно від того, на який об'єкт насправді вказує покажчик.",[5929,7104,7106],{"id":7105},"механізм-статичного-звязування","Механізм статичного зв'язування",[5257,7108,7109,7110,5805,7113,7115,7116,7119,7120,7123,7124,7126,7127,5805,7130,7132],{},"Ця поведінка пояснюється механізмом ",[5742,7111,7112],{},"статичного зв'язування",[5807,7114,5809],{},", також ",[5742,7117,7118],{},"раннє зв'язування"," — ",[5807,7121,7122],{},"early binding","). Коли компілятор зустрічає виклик ",[5261,7125,7098],{},", він аналізує ",[5742,7128,7129],{},"тип покажчика",[5261,7131,6467],{},"), а не реальний тип об'єкта в пам'яті. Компілятор бачить:",[7134,7135,7136],"blockquote",{},[5257,7137,7138,7139,7141,7142,7144,7145,7147,7148,7150],{},"«Покажчик має тип ",[5261,7140,6467],{}," → метод ",[5261,7143,5275],{}," оголошено в класі ",[5261,7146,5263],{}," → генерую виклик ",[5261,7149,5795],{},"».",[5257,7152,7153,7154,7156,7157,7160,7161,5824],{},"Це рішення приймається під час компіляції, задовго до виконання програми. Компілятор не може (і не намагається) визначити, на який конкретний об'єкт вказуватиме ",[5261,7155,6336],{}," під час виконання — адже значення покажчика може змінюватися динамічно (як у нашому прикладі, де ми спочатку присвоїли ",[5261,7158,7159],{},"&murka",", а потім ",[5261,7162,7163],{},"&barsik",[7165,7166,7168],"plant-uml",{"alt":7167},"Статичне зв'язування: компілятор генерує виклик на основі типу покажчика",[5285,7169,7173],{"className":7170,"code":7171,"language":7172,"meta":5291,"style":5291},"language-plantuml shiki shiki-themes light-plus dark-plus dark-plus","@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\n\nactor \"Компілятор\" as Compiler #DBEAFE\nparticipant \"Вихідний код\" as Source #E2E8F0\nparticipant \"Згенерований машинний код\" as Binary #DCFCE7\n\nCompiler -> Source : Аналізує ptrAnimal->speak()\nSource -> Compiler : Тип покажчика: Animal*\nCompiler -> Compiler : speak() оголошено в Animal\nnote over Compiler #FEF3C7\n  Статичне зв'язування:\n  Рішення приймається під час компіляції\nend note\nCompiler -> Binary : Генерує виклик Animal::speak()\nnote over Binary #FECACA\n  Жоден аналіз реального об'єкта\n  в пам'яті не відбувається!\nend note\n@enduml\n","plantuml",[5261,7174,7175,7180,7185,7190,7194,7199,7204,7209,7213,7218,7223,7228,7233,7238,7243,7248,7253,7258,7263,7268,7272],{"__ignoreMap":5291},[5295,7176,7177],{"class":5297,"line":5298},[5295,7178,7179],{},"@startuml\n",[5295,7181,7182],{"class":5297,"line":5309},[5295,7183,7184],{},"skinparam style plain\n",[5295,7186,7187],{"class":5297,"line":5317},[5295,7188,7189],{},"skinparam backgroundColor #FFFFFF\n",[5295,7191,7192],{"class":5297,"line":5324},[5295,7193,5321],{"emptyLinePlaceholder":5320},[5295,7195,7196],{"class":5297,"line":5335},[5295,7197,7198],{},"actor \"Компілятор\" as Compiler #DBEAFE\n",[5295,7200,7201],{"class":5297,"line":5342},[5295,7202,7203],{},"participant \"Вихідний код\" as Source #E2E8F0\n",[5295,7205,7206],{"class":5297,"line":5348},[5295,7207,7208],{},"participant \"Згенерований машинний код\" as Binary #DCFCE7\n",[5295,7210,7211],{"class":5297,"line":5367},[5295,7212,5321],{"emptyLinePlaceholder":5320},[5295,7214,7215],{"class":5297,"line":5372},[5295,7216,7217],{},"Compiler -> Source : Аналізує ptrAnimal->speak()\n",[5295,7219,7220],{"class":5297,"line":5378},[5295,7221,7222],{},"Source -> Compiler : Тип покажчика: Animal*\n",[5295,7224,7225],{"class":5297,"line":5412},[5295,7226,7227],{},"Compiler -> Compiler : speak() оголошено в Animal\n",[5295,7229,7230],{"class":5297,"line":5418},[5295,7231,7232],{},"note over Compiler #FEF3C7\n",[5295,7234,7235],{"class":5297,"line":5447},[5295,7236,7237],{},"  Статичне зв'язування:\n",[5295,7239,7240],{"class":5297,"line":5472},[5295,7241,7242],{},"  Рішення приймається під час компіляції\n",[5295,7244,7245],{"class":5297,"line":5478},[5295,7246,7247],{},"end note\n",[5295,7249,7250],{"class":5297,"line":5483},[5295,7251,7252],{},"Compiler -> Binary : Генерує виклик Animal::speak()\n",[5295,7254,7255],{"class":5297,"line":5499},[5295,7256,7257],{},"note over Binary #FECACA\n",[5295,7259,7260],{"class":5297,"line":5504},[5295,7261,7262],{},"  Жоден аналіз реального об'єкта\n",[5295,7264,7265],{"class":5297,"line":5509},[5295,7266,7267],{},"  в пам'яті не відбувається!\n",[5295,7269,7270],{"class":5297,"line":5535},[5295,7271,7247],{},[5295,7273,7274],{"class":5297,"line":5540},[5295,7275,7276],{},"@enduml\n",[5929,7278,7280],{"id":7279},"чому-статичне-звязування-є-поведінкою-за-замовчуванням","Чому статичне зв'язування є поведінкою за замовчуванням",[5257,7282,7283],{},"Статичне зв'язування — це поведінка за замовчуванням у C++ з двох причин:",[7285,7286,7287,7293],"ol",{},[5837,7288,7289,7292],{},[5742,7290,7291],{},"Продуктивність",": виклик методу через статичне зв'язування не вимагає жодних додаткових операцій під час виконання. Компілятор безпосередньо вставляє адресу функції в машинний код. Це максимально ефективно.",[5837,7294,7295,7298],{},[5742,7296,7297],{},"Сумісність із мовою C",": C++ розширює мову C, яка не має об'єктів і завжди використовує статичне зв'язування для викликів функцій. Якби C++ змінив цю поведінку за замовчуванням, це порушило б сумісність і створило б несподівані накладні витрати.",[5257,7300,7301],{},"Проте для реалізації поліморфізму — здатності обробляти об'єкти різних типів через єдиний інтерфейс — нам потрібен інший механізм.",[5252,7303,7305,7306,7308],{"id":7304},"ключове-слово-virtual-активація-динамічного-звязування","Ключове слово ",[5261,7307,5852],{},": активація динамічного зв'язування",[5929,7310,7312],{"id":7311},"синтаксис-віртуальних-функцій","Синтаксис віртуальних функцій",[5257,7314,7315,7316,7318,7319,5805,7321,7323],{},"Щоб змусити компілятор викликати правильний метод похідного класу через покажчик на базовий клас, потрібно позначити метод базового класу ключовим словом ",[5261,7317,5852],{},". ",[5742,7320,5880],{},[5807,7322,5883],{},") — це метод, для якого вибір конкретної реалізації відбувається під час виконання програми на основі реального типу об'єкта, а не типу покажчика:",[5285,7325,7329],{"className":5287,"code":7326,"filename":7327,"highlights":7328,"language":5290,"meta":5291,"style":5291},"class Animal\n{\npublic:\n    \u002F\u002F Додали ключове слово virtual перед оголошенням методу\n    virtual const char* speak() const { return \"???\"; }\n};\n\nclass Cat : public Animal\n{\npublic:\n    const char* speak() const { return \"Meow\"; }\n};\n\nclass Dog : public Animal\n{\npublic:\n    const char* speak() const { return \"Woof\"; }\n};\n","VirtualFunction.cpp",[5342],[5261,7330,7331,7337,7341,7345,7350,7374,7379,7383,7395,7399,7403,7423,7427,7431,7443,7447,7451,7471],{"__ignoreMap":5291},[5295,7332,7333,7335],{"class":5297,"line":5298},[5295,7334,5328],{"class":5327},[5295,7336,5332],{"class":5331},[5295,7338,7339],{"class":5297,"line":5309},[5295,7340,5339],{"class":5338},[5295,7342,7343],{"class":5297,"line":5317},[5295,7344,5375],{"class":5327},[5295,7346,7347],{"class":5297,"line":5324},[5295,7348,7349],{"class":5710},"    \u002F\u002F Додали ключове слово virtual перед оголошенням методу\n",[5295,7351,7352,7355,7358,7360,7362,7364,7366,7368,7370,7372],{"class":5297,"line":5335},[5295,7353,7354],{"class":5327},"    virtual",[5295,7356,7357],{"class":5327}," const",[5295,7359,5453],{"class":5327},[5295,7361,5456],{"class":5381},[5295,7363,5430],{"class":5338},[5295,7365,5433],{"class":5327},[5295,7367,5436],{"class":5338},[5295,7369,5439],{"class":5301},[5295,7371,5467],{"class":5305},[5295,7373,5444],{"class":5338},[5295,7375,7377],{"class":7376,"line":5342},[5297,6524],[5295,7378,5475],{"class":5338},[5295,7380,7381],{"class":5297,"line":5348},[5295,7382,5321],{"emptyLinePlaceholder":5320},[5295,7384,7385,7387,7389,7391,7393],{"class":5297,"line":5367},[5295,7386,5328],{"class":5327},[5295,7388,6704],{"class":5331},[5295,7390,5491],{"class":5338},[5295,7392,5494],{"class":5327},[5295,7394,5332],{"class":5331},[5295,7396,7397],{"class":5297,"line":5372},[5295,7398,5339],{"class":5338},[5295,7400,7401],{"class":5297,"line":5378},[5295,7402,5375],{"class":5327},[5295,7404,7405,7407,7409,7411,7413,7415,7417,7419,7421],{"class":5297,"line":5412},[5295,7406,5450],{"class":5327},[5295,7408,5453],{"class":5327},[5295,7410,5456],{"class":5381},[5295,7412,5430],{"class":5338},[5295,7414,5433],{"class":5327},[5295,7416,5436],{"class":5338},[5295,7418,5439],{"class":5301},[5295,7420,6737],{"class":5305},[5295,7422,5444],{"class":5338},[5295,7424,7425],{"class":5297,"line":5418},[5295,7426,5475],{"class":5338},[5295,7428,7429],{"class":5297,"line":5447},[5295,7430,5321],{"emptyLinePlaceholder":5320},[5295,7432,7433,7435,7437,7439,7441],{"class":5297,"line":5472},[5295,7434,5328],{"class":5327},[5295,7436,5488],{"class":5331},[5295,7438,5491],{"class":5338},[5295,7440,5494],{"class":5327},[5295,7442,5332],{"class":5331},[5295,7444,7445],{"class":5297,"line":5478},[5295,7446,5339],{"class":5338},[5295,7448,7449],{"class":5297,"line":5483},[5295,7450,5375],{"class":5327},[5295,7452,7453,7455,7457,7459,7461,7463,7465,7467,7469],{"class":5297,"line":5499},[5295,7454,5450],{"class":5327},[5295,7456,5453],{"class":5327},[5295,7458,5456],{"class":5381},[5295,7460,5430],{"class":5338},[5295,7462,5433],{"class":5327},[5295,7464,5436],{"class":5338},[5295,7466,5439],{"class":5301},[5295,7468,5557],{"class":5305},[5295,7470,5444],{"class":5338},[5295,7472,7473],{"class":5297,"line":5504},[5295,7474,5475],{"class":5338},[5257,7476,7477,7478,7480,7481,7483,7484,7487,7488,7490,7491,7493,7494,7496],{},"Тепер метод ",[5261,7479,5275],{}," класу ",[5261,7482,5263],{}," став ",[5742,7485,7486],{},"віртуальним",". Це автоматично робить віртуальними всі його перевизначення в похідних класах (",[5261,7489,7092],{}," та ",[5261,7492,5754],{},"), навіть якщо ми не пишемо ",[5261,7495,5852],{}," перед ними (хоча це рекомендовано для ясності коду).",[7498,7499,7500,7501,7504,7505,7507],"tip",{},"Хоча методи похідних класів автоматично стають віртуальними, якщо вони перевизначають віртуальний метод базового класу, ",[5742,7502,7503],{},"хорошою практикою"," є явне вказування ",[5261,7506,5852],{}," перед перевизначеннями. Це підвищує читабельність коду та служить нагадуванням для інших розробників (і для вас у майбутньому), що метод бере участь у динамічному поліморфізмі.",[5929,7509,7511],{"id":7510},"динамічне-звязування-в-дії","Динамічне зв'язування в дії",[5257,7513,7514],{},"Тепер повторимо наш експеримент з викликами через покажчик на базовий клас:",[5285,7516,7519],{"className":5287,"code":7517,"filename":7518,"language":5290,"meta":5291,"style":5291},"#include \u003Ciostream>\n\nclass Animal\n{\npublic:\n    virtual const char* speak() const { return \"???\"; }\n};\n\nclass Cat : public Animal\n{\npublic:\n    const char* speak() const { return \"Meow\"; }\n};\n\nclass Dog : public Animal\n{\npublic:\n    const char* speak() const { return \"Woof\"; }\n};\n\nint main()\n{\n    Cat murka(\"Мурка\");\n    Dog barsik(\"Барсік\");\n    \n    Animal* ptrAnimal = &murka;\n    std::cout \u003C\u003C \"ptrAnimal->speak() = \" \u003C\u003C ptrAnimal->speak() \u003C\u003C \"\\n\";\n    \n    ptrAnimal = &barsik;\n    std::cout \u003C\u003C \"ptrAnimal->speak() = \" \u003C\u003C ptrAnimal->speak() \u003C\u003C \"\\n\";\n    \n    return 0;\n}\n","DynamicBinding.cpp",[5261,7520,7521,7527,7531,7537,7541,7545,7567,7571,7575,7587,7591,7595,7615,7619,7623,7635,7639,7643,7663,7667,7671,7679,7683,7695,7707,7711,7725,7756,7760,7770,7800,7804,7812],{"__ignoreMap":5291},[5295,7522,7523,7525],{"class":5297,"line":5298},[5295,7524,5302],{"class":5301},[5295,7526,5306],{"class":5305},[5295,7528,7529],{"class":5297,"line":5309},[5295,7530,5321],{"emptyLinePlaceholder":5320},[5295,7532,7533,7535],{"class":5297,"line":5317},[5295,7534,5328],{"class":5327},[5295,7536,5332],{"class":5331},[5295,7538,7539],{"class":5297,"line":5324},[5295,7540,5339],{"class":5338},[5295,7542,7543],{"class":5297,"line":5335},[5295,7544,5375],{"class":5327},[5295,7546,7547,7549,7551,7553,7555,7557,7559,7561,7563,7565],{"class":5297,"line":5342},[5295,7548,7354],{"class":5327},[5295,7550,7357],{"class":5327},[5295,7552,5453],{"class":5327},[5295,7554,5456],{"class":5381},[5295,7556,5430],{"class":5338},[5295,7558,5433],{"class":5327},[5295,7560,5436],{"class":5338},[5295,7562,5439],{"class":5301},[5295,7564,5467],{"class":5305},[5295,7566,5444],{"class":5338},[5295,7568,7569],{"class":5297,"line":5348},[5295,7570,5475],{"class":5338},[5295,7572,7573],{"class":5297,"line":5367},[5295,7574,5321],{"emptyLinePlaceholder":5320},[5295,7576,7577,7579,7581,7583,7585],{"class":5297,"line":5372},[5295,7578,5328],{"class":5327},[5295,7580,6704],{"class":5331},[5295,7582,5491],{"class":5338},[5295,7584,5494],{"class":5327},[5295,7586,5332],{"class":5331},[5295,7588,7589],{"class":5297,"line":5378},[5295,7590,5339],{"class":5338},[5295,7592,7593],{"class":5297,"line":5412},[5295,7594,5375],{"class":5327},[5295,7596,7597,7599,7601,7603,7605,7607,7609,7611,7613],{"class":5297,"line":5418},[5295,7598,5450],{"class":5327},[5295,7600,5453],{"class":5327},[5295,7602,5456],{"class":5381},[5295,7604,5430],{"class":5338},[5295,7606,5433],{"class":5327},[5295,7608,5436],{"class":5338},[5295,7610,5439],{"class":5301},[5295,7612,6737],{"class":5305},[5295,7614,5444],{"class":5338},[5295,7616,7617],{"class":5297,"line":5447},[5295,7618,5475],{"class":5338},[5295,7620,7621],{"class":5297,"line":5472},[5295,7622,5321],{"emptyLinePlaceholder":5320},[5295,7624,7625,7627,7629,7631,7633],{"class":5297,"line":5478},[5295,7626,5328],{"class":5327},[5295,7628,5488],{"class":5331},[5295,7630,5491],{"class":5338},[5295,7632,5494],{"class":5327},[5295,7634,5332],{"class":5331},[5295,7636,7637],{"class":5297,"line":5483},[5295,7638,5339],{"class":5338},[5295,7640,7641],{"class":5297,"line":5499},[5295,7642,5375],{"class":5327},[5295,7644,7645,7647,7649,7651,7653,7655,7657,7659,7661],{"class":5297,"line":5504},[5295,7646,5450],{"class":5327},[5295,7648,5453],{"class":5327},[5295,7650,5456],{"class":5381},[5295,7652,5430],{"class":5338},[5295,7654,5433],{"class":5327},[5295,7656,5436],{"class":5338},[5295,7658,5439],{"class":5301},[5295,7660,5557],{"class":5305},[5295,7662,5444],{"class":5338},[5295,7664,7665],{"class":5297,"line":5509},[5295,7666,5475],{"class":5338},[5295,7668,7669],{"class":5297,"line":5535},[5295,7670,5321],{"emptyLinePlaceholder":5320},[5295,7672,7673,7675,7677],{"class":5297,"line":5540},[5295,7674,5666],{"class":5327},[5295,7676,5669],{"class":5381},[5295,7678,5672],{"class":5338},[5295,7680,7681],{"class":5297,"line":5562},[5295,7682,5339],{"class":5338},[5295,7684,7685,7687,7689,7691,7693],{"class":5297,"line":5567},[5295,7686,6812],{"class":5331},[5295,7688,6815],{"class":5381},[5295,7690,5385],{"class":5338},[5295,7692,6820],{"class":5305},[5295,7694,5693],{"class":5338},[5295,7696,7697,7699,7701,7703,7705],{"class":5297,"line":5572},[5295,7698,5512],{"class":5331},[5295,7700,5685],{"class":5381},[5295,7702,5385],{"class":5338},[5295,7704,6833],{"class":5305},[5295,7706,5693],{"class":5338},[5295,7708,7709],{"class":5297,"line":5597},[5295,7710,5415],{"class":5338},[5295,7712,7713,7715,7717,7719,7721,7723],{"class":5297,"line":5602},[5295,7714,5382],{"class":5331},[5295,7716,6241],{"class":5327},[5295,7718,6244],{"class":5360},[5295,7720,6247],{"class":5338},[5295,7722,6876],{"class":5360},[5295,7724,5364],{"class":5338},[5295,7726,7727,7729,7731,7733,7735,7738,7740,7742,7744,7746,7748,7750,7752,7754],{"class":5297,"line":5652},[5295,7728,5351],{"class":5331},[5295,7730,5354],{"class":5338},[5295,7732,5609],{"class":5360},[5295,7734,5612],{"class":5338},[5295,7736,7737],{"class":5305},"\"ptrAnimal->speak() = \"",[5295,7739,5612],{"class":5338},[5295,7741,6336],{"class":5360},[5295,7743,6339],{"class":5338},[5295,7745,5636],{"class":5381},[5295,7747,5624],{"class":5338},[5295,7749,5641],{"class":5305},[5295,7751,5645],{"class":5644},[5295,7753,5641],{"class":5305},[5295,7755,5364],{"class":5338},[5295,7757,7758],{"class":5297,"line":5658},[5295,7759,5415],{"class":5338},[5295,7761,7762,7764,7766,7768],{"class":5297,"line":5663},[5295,7763,6527],{"class":5360},[5295,7765,6247],{"class":5338},[5295,7767,5704],{"class":5360},[5295,7769,5364],{"class":5338},[5295,7771,7772,7774,7776,7778,7780,7782,7784,7786,7788,7790,7792,7794,7796,7798],{"class":5297,"line":5675},[5295,7773,5351],{"class":5331},[5295,7775,5354],{"class":5338},[5295,7777,5609],{"class":5360},[5295,7779,5612],{"class":5338},[5295,7781,7737],{"class":5305},[5295,7783,5612],{"class":5338},[5295,7785,6336],{"class":5360},[5295,7787,6339],{"class":5338},[5295,7789,5636],{"class":5381},[5295,7791,5624],{"class":5338},[5295,7793,5641],{"class":5305},[5295,7795,5645],{"class":5644},[5295,7797,5641],{"class":5305},[5295,7799,5364],{"class":5338},[5295,7801,7802],{"class":5297,"line":5680},[5295,7803,5415],{"class":5338},[5295,7805,7806,7808,7810],{"class":5297,"line":5696},[5295,7807,5722],{"class":5301},[5295,7809,5726],{"class":5725},[5295,7811,5364],{"class":5338},[5295,7813,7814],{"class":5297,"line":5714},[5295,7815,5655],{"class":5338},[5761,7817,7819,7823],{"title":7818},".\u002FDynamicBinding",[5765,7820,7822],{"className":7821},[5297],"ptrAnimal->speak() = Meow",[5765,7824,7826],{"className":7825},[5297],"ptrAnimal->speak() = Woof",[5257,7828,7829,7830,7832,7833,7835,7836,7838,7839,7841,7842,7838,7844,5618],{},"Чудово працює! Тепер виклик ",[5261,7831,7098],{}," правильно визначає, що спочатку ",[5261,7834,6336],{}," адресує об'єкт ",[5261,7837,5267],{}," і викликає ",[5261,7840,7092],{},", а потім адресує об'єкт ",[5261,7843,5271],{},[5261,7845,5754],{},[5257,7847,7848,7849,5805,7852,7855,7856,7119,7859,7862,7863,7865],{},"Це називається ",[5742,7850,7851],{},"динамічним зв'язуванням",[5807,7853,7854],{},"dynamic binding"," або ",[5742,7857,7858],{},"пізнім зв'язуванням",[5807,7860,7861],{},"late binding","). Рішення про те, який саме метод викликати, відкладається до моменту виконання програми. Коли програма доходить до рядка ",[5261,7864,7098],{},", виконавче середовище С++ аналізує реальний тип об'єкта в пам'яті (за допомогою спеціального механізму, про який ми поговоримо в наступних статтях) і викликає відповідну реалізацію.",[6448,7867,7868,7871,7872,7874,7875,7877,7878,7880],{},[5742,7869,7870],{},"Віртуальність поширюється вниз по ієрархії",": якщо метод оголошено як ",[5261,7873,5852],{}," у базовому класі, всі його перевизначення в похідних класах автоматично стають віртуальними, навіть без явного ключового слова ",[5261,7876,5852],{},". Проте явне вказування ",[5261,7879,5852],{}," у похідних класах робить код чіткішим і підкреслює намір програміста.",[5252,7882,7884],{"id":7883},"поліморфізм-третій-стовп-обєктно-орієнтованого-програмування","Поліморфізм: третій стовп об'єктно-орієнтованого програмування",[5929,7886,7888],{"id":7887},"визначення-та-філософія-поліморфізму","Визначення та філософія поліморфізму",[5257,7890,7891,5805,7893,7895,7896,7899,7900,7903,7904,7907,7908,7910,7911,7913,7914,7916,7917,5618],{},[5742,7892,5872],{},[5807,7894,5823],{},", від грецького ",[5807,7897,7898],{},"poly"," — «багато», ",[5807,7901,7902],{},"morphē"," — «форма») — це здатність об'єктів різних типів реагувати на одне й те саме повідомлення (виклик методу) різними способами. У контексті C++ поліморфізм досягається через віртуальні функції: єдиний виклик ",[5261,7905,7906],{},"animal.speak()"," породжує різну поведінку залежно від того, чи ",[5261,7909,5615],{}," насправді є ",[5261,7912,5267],{},", ",[5261,7915,5271],{},", чи ",[5261,7918,7919],{},"Bird",[5257,7921,7922],{},"Поліморфізм — це третій фундаментальний принцип ООП поруч із інкапсуляцією та наслідуванням:",[5826,7924,7925,7929,7933],{},[5829,7926,7928],{"icon":4128,"title":7927},"🔒 Інкапсуляція","Приховування внутрішньої структури об'єкта та надання контрольованого доступу через публічний інтерфейс. Захищає дані від некоректного використання.",[5829,7930,7932],{"icon":4606,"title":7931},"🧬 Наслідування","Створення нових класів на основі існуючих шляхом успадкування їхньої структури та поведінки. Дозволяє повторно використовувати код і будувати ієрархії типів.",[5829,7934,7937],{"icon":7935,"title":7936},"i-lucide-shapes","🎭 Поліморфізм","Здатність обробляти об'єкти різних класів через єдиний інтерфейс базового класу. Забезпечує гнучкість, розширюваність та уніфікацію коду.",[5257,7939,7940,7941,7944],{},"Поліморфізм звільняє програміста від необхідності знати точний тип об'єкта під час написання коду. Замість написання окремої функції для кожного типу тварини ми пишемо одну функцію, яка приймає ",[5261,7942,7943],{},"Animal&"," і працює з будь-яким нащадком:",[5285,7946,7949],{"className":5287,"code":7947,"filename":7948,"language":5290,"meta":5291,"style":5291},"void report(const Animal& animal)\n{\n    std::cout \u003C\u003C animal.speak() \u003C\u003C \"\\n\";\n}\n\nint main()\n{\n    Cat murka(\"Мурка\");\n    Dog barsik(\"Барсік\");\n    Bird kesha(\"Кеша\");\n    \n    report(murka);   \u002F\u002F Meow\n    report(barsik);  \u002F\u002F Woof\n    report(kesha);   \u002F\u002F Tweet\n    \n    return 0;\n}\n","PolymorphicReport.cpp",[5261,7950,7951,7969,7973,7999,8003,8007,8015,8019,8031,8043,8058,8062,8075,8088,8102,8106,8114],{"__ignoreMap":5291},[5295,7952,7953,7955,7957,7959,7961,7963,7965,7967],{"class":5297,"line":5298},[5295,7954,5575],{"class":5327},[5295,7956,5578],{"class":5381},[5295,7958,5385],{"class":5338},[5295,7960,5433],{"class":5327},[5295,7962,5585],{"class":5331},[5295,7964,5588],{"class":5327},[5295,7966,5591],{"class":5360},[5295,7968,5594],{"class":5338},[5295,7970,7971],{"class":5297,"line":5309},[5295,7972,5339],{"class":5338},[5295,7974,7975,7977,7979,7981,7983,7985,7987,7989,7991,7993,7995,7997],{"class":5297,"line":5317},[5295,7976,5351],{"class":5331},[5295,7978,5354],{"class":5338},[5295,7980,5609],{"class":5360},[5295,7982,5612],{"class":5338},[5295,7984,5615],{"class":5360},[5295,7986,5618],{"class":5338},[5295,7988,5636],{"class":5381},[5295,7990,5624],{"class":5338},[5295,7992,5641],{"class":5305},[5295,7994,5645],{"class":5644},[5295,7996,5641],{"class":5305},[5295,7998,5364],{"class":5338},[5295,8000,8001],{"class":5297,"line":5324},[5295,8002,5655],{"class":5338},[5295,8004,8005],{"class":5297,"line":5335},[5295,8006,5321],{"emptyLinePlaceholder":5320},[5295,8008,8009,8011,8013],{"class":5297,"line":5342},[5295,8010,5666],{"class":5327},[5295,8012,5669],{"class":5381},[5295,8014,5672],{"class":5338},[5295,8016,8017],{"class":5297,"line":5348},[5295,8018,5339],{"class":5338},[5295,8020,8021,8023,8025,8027,8029],{"class":5297,"line":5367},[5295,8022,6812],{"class":5331},[5295,8024,6815],{"class":5381},[5295,8026,5385],{"class":5338},[5295,8028,6820],{"class":5305},[5295,8030,5693],{"class":5338},[5295,8032,8033,8035,8037,8039,8041],{"class":5297,"line":5372},[5295,8034,5512],{"class":5331},[5295,8036,5685],{"class":5381},[5295,8038,5385],{"class":5338},[5295,8040,6833],{"class":5305},[5295,8042,5693],{"class":5338},[5295,8044,8045,8048,8051,8053,8056],{"class":5297,"line":5378},[5295,8046,8047],{"class":5331},"    Bird",[5295,8049,8050],{"class":5381}," kesha",[5295,8052,5385],{"class":5338},[5295,8054,8055],{"class":5305},"\"Кеша\"",[5295,8057,5693],{"class":5338},[5295,8059,8060],{"class":5297,"line":5412},[5295,8061,5415],{"class":5338},[5295,8063,8064,8066,8068,8070,8072],{"class":5297,"line":5418},[5295,8065,5699],{"class":5381},[5295,8067,5385],{"class":5338},[5295,8069,6876],{"class":5360},[5295,8071,5707],{"class":5338},[5295,8073,8074],{"class":5710},"   \u002F\u002F Meow\n",[5295,8076,8077,8079,8081,8083,8085],{"class":5297,"line":5447},[5295,8078,5699],{"class":5381},[5295,8080,5385],{"class":5338},[5295,8082,5704],{"class":5360},[5295,8084,5707],{"class":5338},[5295,8086,8087],{"class":5710},"  \u002F\u002F Woof\n",[5295,8089,8090,8092,8094,8097,8099],{"class":5297,"line":5472},[5295,8091,5699],{"class":5381},[5295,8093,5385],{"class":5338},[5295,8095,8096],{"class":5360},"kesha",[5295,8098,5707],{"class":5338},[5295,8100,8101],{"class":5710},"   \u002F\u002F Tweet\n",[5295,8103,8104],{"class":5297,"line":5478},[5295,8105,5415],{"class":5338},[5295,8107,8108,8110,8112],{"class":5297,"line":5483},[5295,8109,5722],{"class":5301},[5295,8111,5726],{"class":5725},[5295,8113,5364],{"class":5338},[5295,8115,8116],{"class":5297,"line":5499},[5295,8117,5655],{"class":5338},[5257,8119,8120,8121,8123,8124,8126,8127,8129,8130,5805,8133,8136],{},"Функція ",[5261,8122,5279],{}," не знає і не повинна знати, з яким конкретним класом вона працює — їй достатньо знати, що об'єкт успадковує ",[5261,8125,5263],{}," і має метод ",[5261,8128,5275],{},". Це ",[5742,8131,8132],{},"програмування до інтерфейсу, а не до реалізації",[5807,8134,8135],{},"programming to an interface, not an implementation",") — один із ключових принципів проєктування програмних систем.",[5929,8138,8140],{"id":8139},"унікальна-функція-замість-перевантажень","Унікальна функція замість перевантажень",[5257,8142,8143,8144,8146],{},"Без поліморфізму для обробки різних типів тварин довелося б писати окремі перевантаження функції ",[5261,8145,5279],{}," для кожного класу:",[5285,8148,8151],{"className":5287,"code":8149,"filename":8150,"language":5290,"meta":5291,"style":5291},"void report(const Cat& cat)\n{\n    std::cout \u003C\u003C cat.speak() \u003C\u003C \"\\n\";\n}\n\nvoid report(const Dog& dog)\n{\n    std::cout \u003C\u003C dog.speak() \u003C\u003C \"\\n\";\n}\n\nvoid report(const Bird& bird)\n{\n    std::cout \u003C\u003C bird.speak() \u003C\u003C \"\\n\";\n}\n\n\u002F\u002F І так далі для кожного нового типу тварини...\n","WithoutPolymorphism.cpp",[5261,8152,8153,8172,8176,8203,8207,8211,8230,8234,8261,8265,8269,8289,8293,8320,8324,8328],{"__ignoreMap":5291},[5295,8154,8155,8157,8159,8161,8163,8165,8167,8170],{"class":5297,"line":5298},[5295,8156,5575],{"class":5327},[5295,8158,5578],{"class":5381},[5295,8160,5385],{"class":5338},[5295,8162,5433],{"class":5327},[5295,8164,6704],{"class":5331},[5295,8166,5588],{"class":5327},[5295,8168,8169],{"class":5360}," cat",[5295,8171,5594],{"class":5338},[5295,8173,8174],{"class":5297,"line":5309},[5295,8175,5339],{"class":5338},[5295,8177,8178,8180,8182,8184,8186,8189,8191,8193,8195,8197,8199,8201],{"class":5297,"line":5317},[5295,8179,5351],{"class":5331},[5295,8181,5354],{"class":5338},[5295,8183,5609],{"class":5360},[5295,8185,5612],{"class":5338},[5295,8187,8188],{"class":5360},"cat",[5295,8190,5618],{"class":5338},[5295,8192,5636],{"class":5381},[5295,8194,5624],{"class":5338},[5295,8196,5641],{"class":5305},[5295,8198,5645],{"class":5644},[5295,8200,5641],{"class":5305},[5295,8202,5364],{"class":5338},[5295,8204,8205],{"class":5297,"line":5324},[5295,8206,5655],{"class":5338},[5295,8208,8209],{"class":5297,"line":5335},[5295,8210,5321],{"emptyLinePlaceholder":5320},[5295,8212,8213,8215,8217,8219,8221,8223,8225,8228],{"class":5297,"line":5342},[5295,8214,5575],{"class":5327},[5295,8216,5578],{"class":5381},[5295,8218,5385],{"class":5338},[5295,8220,5433],{"class":5327},[5295,8222,5488],{"class":5331},[5295,8224,5588],{"class":5327},[5295,8226,8227],{"class":5360}," dog",[5295,8229,5594],{"class":5338},[5295,8231,8232],{"class":5297,"line":5348},[5295,8233,5339],{"class":5338},[5295,8235,8236,8238,8240,8242,8244,8247,8249,8251,8253,8255,8257,8259],{"class":5297,"line":5367},[5295,8237,5351],{"class":5331},[5295,8239,5354],{"class":5338},[5295,8241,5609],{"class":5360},[5295,8243,5612],{"class":5338},[5295,8245,8246],{"class":5360},"dog",[5295,8248,5618],{"class":5338},[5295,8250,5636],{"class":5381},[5295,8252,5624],{"class":5338},[5295,8254,5641],{"class":5305},[5295,8256,5645],{"class":5644},[5295,8258,5641],{"class":5305},[5295,8260,5364],{"class":5338},[5295,8262,8263],{"class":5297,"line":5372},[5295,8264,5655],{"class":5338},[5295,8266,8267],{"class":5297,"line":5378},[5295,8268,5321],{"emptyLinePlaceholder":5320},[5295,8270,8271,8273,8275,8277,8279,8282,8284,8287],{"class":5297,"line":5412},[5295,8272,5575],{"class":5327},[5295,8274,5578],{"class":5381},[5295,8276,5385],{"class":5338},[5295,8278,5433],{"class":5327},[5295,8280,8281],{"class":5331}," Bird",[5295,8283,5588],{"class":5327},[5295,8285,8286],{"class":5360}," bird",[5295,8288,5594],{"class":5338},[5295,8290,8291],{"class":5297,"line":5418},[5295,8292,5339],{"class":5338},[5295,8294,8295,8297,8299,8301,8303,8306,8308,8310,8312,8314,8316,8318],{"class":5297,"line":5447},[5295,8296,5351],{"class":5331},[5295,8298,5354],{"class":5338},[5295,8300,5609],{"class":5360},[5295,8302,5612],{"class":5338},[5295,8304,8305],{"class":5360},"bird",[5295,8307,5618],{"class":5338},[5295,8309,5636],{"class":5381},[5295,8311,5624],{"class":5338},[5295,8313,5641],{"class":5305},[5295,8315,5645],{"class":5644},[5295,8317,5641],{"class":5305},[5295,8319,5364],{"class":5338},[5295,8321,8322],{"class":5297,"line":5472},[5295,8323,5655],{"class":5338},[5295,8325,8326],{"class":5297,"line":5478},[5295,8327,5321],{"emptyLinePlaceholder":5320},[5295,8329,8330],{"class":5297,"line":5483},[5295,8331,8332],{"class":5710},"\u002F\u002F І так далі для кожного нового типу тварини...\n",[5257,8334,8335,8336,8338,8339,8342],{},"Уявіть, що у вашій ієрархії 30 різних класів тварин. Вам довелося б написати 30 версій функції ",[5261,8337,5279],{},". Більше того, кожного разу, коли ви додаєте новий клас (",[5261,8340,8341],{},"class Snake","), вам потрібно не забути додати ще одне перевантаження. Це призводить до надмірного дублювання коду, підвищує ймовірність помилок і ускладнює підтримку.",[5257,8344,8345,8346,8349,8350,8353,8354,8356],{},"Поліморфізм вирішує цю проблему елегантно: ",[5742,8347,8348],{},"одна функція працює з усіма поточними та майбутніми похідними класами",". Додавання нового класу ",[5261,8351,8352],{},"Snake : public Animal"," не вимагає жодних змін у функції ",[5261,8355,5279],{}," — вона автоматично працюватиме з новим типом.",[6448,8358,8359,5805,8362,8365],{},[5742,8360,8361],{},"Принцип відкритості\u002Fзакритості",[5807,8363,8364],{},"Open\u002FClosed Principle","): програмні сутності мають бути відкриті для розширення, але закриті для модифікації. Поліморфізм дозволяє додавати нові типи (розширювати систему) без зміни існуючого коду, який працює з базовим класом.",[5252,8367,8369],{"id":8368},"гетерогенні-колекції-єдиний-масив-для-різних-типів","Гетерогенні колекції: єдиний масив для різних типів",[5929,8371,8373],{"id":8372},"проблема-зберігання-обєктів-різних-класів","Проблема зберігання об'єктів різних класів",[5257,8375,8376],{},"Припустимо, ми хочемо зберегти кілька тварин різних типів і обробити їх у циклі. Без поліморфізму нам довелося б створювати окремі масиви для кожного типу:",[5285,8378,8381],{"className":5287,"code":8379,"filename":8380,"language":5290,"meta":5291,"style":5291},"int main()\n{\n    Cat cats[] = { Cat(\"Мурка\"), Cat(\"Рижик\"), Cat(\"Барсик\") };\n    Dog dogs[] = { Dog(\"Бобік\"), Dog(\"Джек\"), Dog(\"Рекс\") };\n    \n    for (int i = 0; i \u003C 3; i++) {\n        std::cout \u003C\u003C cats[i].speak() \u003C\u003C \"\\n\";\n    }\n    \n    for (int i = 0; i \u003C 3; i++) {\n        std::cout \u003C\u003C dogs[i].speak() \u003C\u003C \"\\n\";\n    }\n    \n    return 0;\n}\n","SeparateArrays.cpp",[5261,8382,8383,8391,8395,8432,8468,8472,8508,8542,8547,8551,8579,8610,8614,8618,8626],{"__ignoreMap":5291},[5295,8384,8385,8387,8389],{"class":5297,"line":5298},[5295,8386,5666],{"class":5327},[5295,8388,5669],{"class":5381},[5295,8390,5672],{"class":5338},[5295,8392,8393],{"class":5297,"line":5309},[5295,8394,5339],{"class":5338},[5295,8396,8397,8399,8402,8405,8407,8409,8411,8414,8416,8418,8421,8423,8425,8427,8429],{"class":5297,"line":5317},[5295,8398,6812],{"class":5331},[5295,8400,8401],{"class":5360}," cats",[5295,8403,8404],{"class":5338},"[] = { ",[5295,8406,5267],{"class":5381},[5295,8408,5385],{"class":5338},[5295,8410,6820],{"class":5305},[5295,8412,8413],{"class":5338},"), ",[5295,8415,5267],{"class":5381},[5295,8417,5385],{"class":5338},[5295,8419,8420],{"class":5305},"\"Рижик\"",[5295,8422,8413],{"class":5338},[5295,8424,5267],{"class":5381},[5295,8426,5385],{"class":5338},[5295,8428,5690],{"class":5305},[5295,8430,8431],{"class":5338},") };\n",[5295,8433,8434,8436,8439,8441,8443,8445,8448,8450,8452,8454,8457,8459,8461,8463,8466],{"class":5297,"line":5324},[5295,8435,5512],{"class":5331},[5295,8437,8438],{"class":5360}," dogs",[5295,8440,8404],{"class":5338},[5295,8442,5271],{"class":5381},[5295,8444,5385],{"class":5338},[5295,8446,8447],{"class":5305},"\"Бобік\"",[5295,8449,8413],{"class":5338},[5295,8451,5271],{"class":5381},[5295,8453,5385],{"class":5338},[5295,8455,8456],{"class":5305},"\"Джек\"",[5295,8458,8413],{"class":5338},[5295,8460,5271],{"class":5381},[5295,8462,5385],{"class":5338},[5295,8464,8465],{"class":5305},"\"Рекс\"",[5295,8467,8431],{"class":5338},[5295,8469,8470],{"class":5297,"line":5335},[5295,8471,5415],{"class":5338},[5295,8473,8474,8477,8479,8481,8484,8486,8489,8492,8495,8498,8501,8503,8505],{"class":5297,"line":5342},[5295,8475,8476],{"class":5301},"    for",[5295,8478,5805],{"class":5338},[5295,8480,5666],{"class":5327},[5295,8482,8483],{"class":5360}," i",[5295,8485,6276],{"class":5338},[5295,8487,8488],{"class":5725},"0",[5295,8490,8491],{"class":5338},"; ",[5295,8493,8494],{"class":5360},"i",[5295,8496,8497],{"class":5338}," \u003C ",[5295,8499,8500],{"class":5725},"3",[5295,8502,8491],{"class":5338},[5295,8504,8494],{"class":5360},[5295,8506,8507],{"class":5338},"++) {\n",[5295,8509,8510,8513,8515,8517,8519,8522,8525,8527,8530,8532,8534,8536,8538,8540],{"class":5297,"line":5348},[5295,8511,8512],{"class":5331},"        std",[5295,8514,5354],{"class":5338},[5295,8516,5609],{"class":5360},[5295,8518,5612],{"class":5338},[5295,8520,8521],{"class":5360},"cats",[5295,8523,8524],{"class":5338},"[",[5295,8526,8494],{"class":5360},[5295,8528,8529],{"class":5338},"].",[5295,8531,5636],{"class":5381},[5295,8533,5624],{"class":5338},[5295,8535,5641],{"class":5305},[5295,8537,5645],{"class":5644},[5295,8539,5641],{"class":5305},[5295,8541,5364],{"class":5338},[5295,8543,8544],{"class":5297,"line":5367},[5295,8545,8546],{"class":5338},"    }\n",[5295,8548,8549],{"class":5297,"line":5372},[5295,8550,5415],{"class":5338},[5295,8552,8553,8555,8557,8559,8561,8563,8565,8567,8569,8571,8573,8575,8577],{"class":5297,"line":5378},[5295,8554,8476],{"class":5301},[5295,8556,5805],{"class":5338},[5295,8558,5666],{"class":5327},[5295,8560,8483],{"class":5360},[5295,8562,6276],{"class":5338},[5295,8564,8488],{"class":5725},[5295,8566,8491],{"class":5338},[5295,8568,8494],{"class":5360},[5295,8570,8497],{"class":5338},[5295,8572,8500],{"class":5725},[5295,8574,8491],{"class":5338},[5295,8576,8494],{"class":5360},[5295,8578,8507],{"class":5338},[5295,8580,8581,8583,8585,8587,8589,8592,8594,8596,8598,8600,8602,8604,8606,8608],{"class":5297,"line":5412},[5295,8582,8512],{"class":5331},[5295,8584,5354],{"class":5338},[5295,8586,5609],{"class":5360},[5295,8588,5612],{"class":5338},[5295,8590,8591],{"class":5360},"dogs",[5295,8593,8524],{"class":5338},[5295,8595,8494],{"class":5360},[5295,8597,8529],{"class":5338},[5295,8599,5636],{"class":5381},[5295,8601,5624],{"class":5338},[5295,8603,5641],{"class":5305},[5295,8605,5645],{"class":5644},[5295,8607,5641],{"class":5305},[5295,8609,5364],{"class":5338},[5295,8611,8612],{"class":5297,"line":5418},[5295,8613,8546],{"class":5338},[5295,8615,8616],{"class":5297,"line":5447},[5295,8617,5415],{"class":5338},[5295,8619,8620,8622,8624],{"class":5297,"line":5472},[5295,8621,5722],{"class":5301},[5295,8623,5726],{"class":5725},[5295,8625,5364],{"class":5338},[5295,8627,8628],{"class":5297,"line":5478},[5295,8629,5655],{"class":5338},[5257,8631,8632],{},"Це незручно, негнучко і не масштабується. Якщо у нас 10 типів тварин, потрібно 10 окремих масивів і 10 окремих циклів. Більше того, ми не можемо легко перемішати тварин різних типів у порядку, який нам потрібен (наприклад, кіт, собака, кіт, птах).",[5929,8634,8636],{"id":8635},"масив-покажчиків-на-базовий-клас","Масив покажчиків на базовий клас",[5257,8638,8639,8640,5805,8643,8646],{},"Поліморфізм дозволяє створити ",[5742,8641,8642],{},"гетерогенну колекцію",[5807,8644,8645],{},"heterogeneous collection",") — масив покажчиків на базовий клас, де кожен елемент може адресувати об'єкт будь-якого похідного класу:",[5285,8648,8651],{"className":5287,"code":8649,"filename":8650,"language":5290,"meta":5291,"style":5291},"#include \u003Ciostream>\n\nclass Animal\n{\nprotected:\n    std::string name;\n\npublic:\n    Animal(std::string n) : name(n) {}\n    \n    std::string getName() const { return name; }\n    virtual const char* speak() const { return \"???\"; }\n};\n\nclass Cat : public Animal\n{\npublic:\n    Cat(std::string n) : Animal(n) {}\n    const char* speak() const { return \"Meow\"; }\n};\n\nclass Dog : public Animal\n{\npublic:\n    Dog(std::string n) : Animal(n) {}\n    const char* speak() const { return \"Woof\"; }\n};\n\nclass Bird : public Animal\n{\npublic:\n    Bird(std::string n) : Animal(n) {}\n    const char* speak() const { return \"Tweet\"; }\n};\n\nint main()\n{\n    Cat murka(\"Мурка\");\n    Dog barsik(\"Барсік\");\n    Bird kesha(\"Кеша\");\n    Cat ryzhyk(\"Рижик\");\n    Dog bobik(\"Бобік\");\n    \n    \u002F\u002F Масив покажчиків на Animal може зберігати адреси об'єктів різних похідних класів\n    Animal* animals[] = { &murka, &barsik, &kesha, &ryzhyk, &bobik };\n    \n    std::cout \u003C\u003C \"Усі тварини говорять:\\n\";\n    for (int i = 0; i \u003C 5; i++) {\n        std::cout \u003C\u003C \"  \" \u003C\u003C animals[i]->getName() \n                  \u003C\u003C \" каже \" \u003C\u003C animals[i]->speak() \u003C\u003C \"\\n\";\n    }\n    \n    return 0;\n}\n","PolymorphicArray.cpp",[5261,8652,8653,8659,8663,8669,8673,8677,8689,8693,8697,8721,8725,8747,8769,8773,8777,8789,8793,8797,8821,8841,8845,8849,8861,8865,8869,8893,8913,8917,8921,8933,8937,8941,8965,8986,8990,8994,9002,9006,9018,9030,9043,9057,9071,9076,9082,9119,9124,9144,9174,9205,9235,9240,9245,9254],{"__ignoreMap":5291},[5295,8654,8655,8657],{"class":5297,"line":5298},[5295,8656,5302],{"class":5301},[5295,8658,5306],{"class":5305},[5295,8660,8661],{"class":5297,"line":5309},[5295,8662,5321],{"emptyLinePlaceholder":5320},[5295,8664,8665,8667],{"class":5297,"line":5317},[5295,8666,5328],{"class":5327},[5295,8668,5332],{"class":5331},[5295,8670,8671],{"class":5297,"line":5324},[5295,8672,5339],{"class":5338},[5295,8674,8675],{"class":5297,"line":5335},[5295,8676,5345],{"class":5327},[5295,8678,8679,8681,8683,8685,8687],{"class":5297,"line":5342},[5295,8680,5351],{"class":5331},[5295,8682,5354],{"class":5338},[5295,8684,5357],{"class":5331},[5295,8686,5361],{"class":5360},[5295,8688,5364],{"class":5338},[5295,8690,8691],{"class":5297,"line":5348},[5295,8692,5321],{"emptyLinePlaceholder":5320},[5295,8694,8695],{"class":5297,"line":5367},[5295,8696,5375],{"class":5327},[5295,8698,8699,8701,8703,8705,8707,8709,8711,8713,8715,8717,8719],{"class":5297,"line":5372},[5295,8700,5382],{"class":5381},[5295,8702,5385],{"class":5338},[5295,8704,5388],{"class":5331},[5295,8706,5354],{"class":5338},[5295,8708,5357],{"class":5331},[5295,8710,5395],{"class":5360},[5295,8712,5398],{"class":5338},[5295,8714,5401],{"class":5381},[5295,8716,5385],{"class":5338},[5295,8718,5406],{"class":5360},[5295,8720,5409],{"class":5338},[5295,8722,8723],{"class":5297,"line":5378},[5295,8724,5415],{"class":5338},[5295,8726,8727,8729,8731,8733,8735,8737,8739,8741,8743,8745],{"class":5297,"line":5412},[5295,8728,5351],{"class":5331},[5295,8730,5354],{"class":5338},[5295,8732,5357],{"class":5331},[5295,8734,5427],{"class":5381},[5295,8736,5430],{"class":5338},[5295,8738,5433],{"class":5327},[5295,8740,5436],{"class":5338},[5295,8742,5439],{"class":5301},[5295,8744,5361],{"class":5360},[5295,8746,5444],{"class":5338},[5295,8748,8749,8751,8753,8755,8757,8759,8761,8763,8765,8767],{"class":5297,"line":5418},[5295,8750,7354],{"class":5327},[5295,8752,7357],{"class":5327},[5295,8754,5453],{"class":5327},[5295,8756,5456],{"class":5381},[5295,8758,5430],{"class":5338},[5295,8760,5433],{"class":5327},[5295,8762,5436],{"class":5338},[5295,8764,5439],{"class":5301},[5295,8766,5467],{"class":5305},[5295,8768,5444],{"class":5338},[5295,8770,8771],{"class":5297,"line":5447},[5295,8772,5475],{"class":5338},[5295,8774,8775],{"class":5297,"line":5472},[5295,8776,5321],{"emptyLinePlaceholder":5320},[5295,8778,8779,8781,8783,8785,8787],{"class":5297,"line":5478},[5295,8780,5328],{"class":5327},[5295,8782,6704],{"class":5331},[5295,8784,5491],{"class":5338},[5295,8786,5494],{"class":5327},[5295,8788,5332],{"class":5331},[5295,8790,8791],{"class":5297,"line":5483},[5295,8792,5339],{"class":5338},[5295,8794,8795],{"class":5297,"line":5499},[5295,8796,5375],{"class":5327},[5295,8798,8799,8801,8803,8805,8807,8809,8811,8813,8815,8817,8819],{"class":5297,"line":5504},[5295,8800,6812],{"class":5381},[5295,8802,5385],{"class":5338},[5295,8804,5388],{"class":5331},[5295,8806,5354],{"class":5338},[5295,8808,5357],{"class":5331},[5295,8810,5395],{"class":5360},[5295,8812,5398],{"class":5338},[5295,8814,5263],{"class":5381},[5295,8816,5385],{"class":5338},[5295,8818,5406],{"class":5360},[5295,8820,5409],{"class":5338},[5295,8822,8823,8825,8827,8829,8831,8833,8835,8837,8839],{"class":5297,"line":5509},[5295,8824,5450],{"class":5327},[5295,8826,5453],{"class":5327},[5295,8828,5456],{"class":5381},[5295,8830,5430],{"class":5338},[5295,8832,5433],{"class":5327},[5295,8834,5436],{"class":5338},[5295,8836,5439],{"class":5301},[5295,8838,6737],{"class":5305},[5295,8840,5444],{"class":5338},[5295,8842,8843],{"class":5297,"line":5535},[5295,8844,5475],{"class":5338},[5295,8846,8847],{"class":5297,"line":5540},[5295,8848,5321],{"emptyLinePlaceholder":5320},[5295,8850,8851,8853,8855,8857,8859],{"class":5297,"line":5562},[5295,8852,5328],{"class":5327},[5295,8854,5488],{"class":5331},[5295,8856,5491],{"class":5338},[5295,8858,5494],{"class":5327},[5295,8860,5332],{"class":5331},[5295,8862,8863],{"class":5297,"line":5567},[5295,8864,5339],{"class":5338},[5295,8866,8867],{"class":5297,"line":5572},[5295,8868,5375],{"class":5327},[5295,8870,8871,8873,8875,8877,8879,8881,8883,8885,8887,8889,8891],{"class":5297,"line":5597},[5295,8872,5512],{"class":5381},[5295,8874,5385],{"class":5338},[5295,8876,5388],{"class":5331},[5295,8878,5354],{"class":5338},[5295,8880,5357],{"class":5331},[5295,8882,5395],{"class":5360},[5295,8884,5398],{"class":5338},[5295,8886,5263],{"class":5381},[5295,8888,5385],{"class":5338},[5295,8890,5406],{"class":5360},[5295,8892,5409],{"class":5338},[5295,8894,8895,8897,8899,8901,8903,8905,8907,8909,8911],{"class":5297,"line":5602},[5295,8896,5450],{"class":5327},[5295,8898,5453],{"class":5327},[5295,8900,5456],{"class":5381},[5295,8902,5430],{"class":5338},[5295,8904,5433],{"class":5327},[5295,8906,5436],{"class":5338},[5295,8908,5439],{"class":5301},[5295,8910,5557],{"class":5305},[5295,8912,5444],{"class":5338},[5295,8914,8915],{"class":5297,"line":5652},[5295,8916,5475],{"class":5338},[5295,8918,8919],{"class":5297,"line":5658},[5295,8920,5321],{"emptyLinePlaceholder":5320},[5295,8922,8923,8925,8927,8929,8931],{"class":5297,"line":5663},[5295,8924,5328],{"class":5327},[5295,8926,8281],{"class":5331},[5295,8928,5491],{"class":5338},[5295,8930,5494],{"class":5327},[5295,8932,5332],{"class":5331},[5295,8934,8935],{"class":5297,"line":5675},[5295,8936,5339],{"class":5338},[5295,8938,8939],{"class":5297,"line":5680},[5295,8940,5375],{"class":5327},[5295,8942,8943,8945,8947,8949,8951,8953,8955,8957,8959,8961,8963],{"class":5297,"line":5696},[5295,8944,8047],{"class":5381},[5295,8946,5385],{"class":5338},[5295,8948,5388],{"class":5331},[5295,8950,5354],{"class":5338},[5295,8952,5357],{"class":5331},[5295,8954,5395],{"class":5360},[5295,8956,5398],{"class":5338},[5295,8958,5263],{"class":5381},[5295,8960,5385],{"class":5338},[5295,8962,5406],{"class":5360},[5295,8964,5409],{"class":5338},[5295,8966,8967,8969,8971,8973,8975,8977,8979,8981,8984],{"class":5297,"line":5714},[5295,8968,5450],{"class":5327},[5295,8970,5453],{"class":5327},[5295,8972,5456],{"class":5381},[5295,8974,5430],{"class":5338},[5295,8976,5433],{"class":5327},[5295,8978,5436],{"class":5338},[5295,8980,5439],{"class":5301},[5295,8982,8983],{"class":5305}," \"Tweet\"",[5295,8985,5444],{"class":5338},[5295,8987,8988],{"class":5297,"line":5719},[5295,8989,5475],{"class":5338},[5295,8991,8992],{"class":5297,"line":5731},[5295,8993,5321],{"emptyLinePlaceholder":5320},[5295,8995,8996,8998,9000],{"class":5297,"line":6354},[5295,8997,5666],{"class":5327},[5295,8999,5669],{"class":5381},[5295,9001,5672],{"class":5338},[5295,9003,9004],{"class":5297,"line":6387},[5295,9005,5339],{"class":5338},[5295,9007,9008,9010,9012,9014,9016],{"class":5297,"line":6392},[5295,9009,6812],{"class":5331},[5295,9011,6815],{"class":5381},[5295,9013,5385],{"class":5338},[5295,9015,6820],{"class":5305},[5295,9017,5693],{"class":5338},[5295,9019,9020,9022,9024,9026,9028],{"class":5297,"line":6401},[5295,9021,5512],{"class":5331},[5295,9023,5685],{"class":5381},[5295,9025,5385],{"class":5338},[5295,9027,6833],{"class":5305},[5295,9029,5693],{"class":5338},[5295,9031,9033,9035,9037,9039,9041],{"class":5297,"line":9032},40,[5295,9034,8047],{"class":5331},[5295,9036,8050],{"class":5381},[5295,9038,5385],{"class":5338},[5295,9040,8055],{"class":5305},[5295,9042,5693],{"class":5338},[5295,9044,9046,9048,9051,9053,9055],{"class":5297,"line":9045},41,[5295,9047,6812],{"class":5331},[5295,9049,9050],{"class":5381}," ryzhyk",[5295,9052,5385],{"class":5338},[5295,9054,8420],{"class":5305},[5295,9056,5693],{"class":5338},[5295,9058,9060,9062,9065,9067,9069],{"class":5297,"line":9059},42,[5295,9061,5512],{"class":5331},[5295,9063,9064],{"class":5381}," bobik",[5295,9066,5385],{"class":5338},[5295,9068,8447],{"class":5305},[5295,9070,5693],{"class":5338},[5295,9072,9074],{"class":5297,"line":9073},43,[5295,9075,5415],{"class":5338},[5295,9077,9079],{"class":5297,"line":9078},44,[5295,9080,9081],{"class":5710},"    \u002F\u002F Масив покажчиків на Animal може зберігати адреси об'єктів різних похідних класів\n",[5295,9083,9085,9087,9089,9092,9095,9097,9100,9102,9104,9106,9108,9111,9113,9116],{"class":5297,"line":9084},45,[5295,9086,5382],{"class":5331},[5295,9088,6241],{"class":5327},[5295,9090,9091],{"class":5360}," animals",[5295,9093,9094],{"class":5338},"[] = { &",[5295,9096,6876],{"class":5360},[5295,9098,9099],{"class":5338},", &",[5295,9101,5704],{"class":5360},[5295,9103,9099],{"class":5338},[5295,9105,8096],{"class":5360},[5295,9107,9099],{"class":5338},[5295,9109,9110],{"class":5360},"ryzhyk",[5295,9112,9099],{"class":5338},[5295,9114,9115],{"class":5360},"bobik",[5295,9117,9118],{"class":5338}," };\n",[5295,9120,9122],{"class":5297,"line":9121},46,[5295,9123,5415],{"class":5338},[5295,9125,9127,9129,9131,9133,9135,9138,9140,9142],{"class":5297,"line":9126},47,[5295,9128,5351],{"class":5331},[5295,9130,5354],{"class":5338},[5295,9132,5609],{"class":5360},[5295,9134,5612],{"class":5338},[5295,9136,9137],{"class":5305},"\"Усі тварини говорять:",[5295,9139,5645],{"class":5644},[5295,9141,5641],{"class":5305},[5295,9143,5364],{"class":5338},[5295,9145,9147,9149,9151,9153,9155,9157,9159,9161,9163,9165,9168,9170,9172],{"class":5297,"line":9146},48,[5295,9148,8476],{"class":5301},[5295,9150,5805],{"class":5338},[5295,9152,5666],{"class":5327},[5295,9154,8483],{"class":5360},[5295,9156,6276],{"class":5338},[5295,9158,8488],{"class":5725},[5295,9160,8491],{"class":5338},[5295,9162,8494],{"class":5360},[5295,9164,8497],{"class":5338},[5295,9166,9167],{"class":5725},"5",[5295,9169,8491],{"class":5338},[5295,9171,8494],{"class":5360},[5295,9173,8507],{"class":5338},[5295,9175,9177,9179,9181,9183,9185,9188,9190,9193,9195,9197,9200,9202],{"class":5297,"line":9176},49,[5295,9178,8512],{"class":5331},[5295,9180,5354],{"class":5338},[5295,9182,5609],{"class":5360},[5295,9184,5612],{"class":5338},[5295,9186,9187],{"class":5305},"\"  \"",[5295,9189,5612],{"class":5338},[5295,9191,9192],{"class":5360},"animals",[5295,9194,8524],{"class":5338},[5295,9196,8494],{"class":5360},[5295,9198,9199],{"class":5338},"]->",[5295,9201,5621],{"class":5381},[5295,9203,9204],{"class":5338},"() \n",[5295,9206,9208,9211,9213,9215,9217,9219,9221,9223,9225,9227,9229,9231,9233],{"class":5297,"line":9207},50,[5295,9209,9210],{"class":5338},"                  \u003C\u003C ",[5295,9212,5627],{"class":5305},[5295,9214,5612],{"class":5338},[5295,9216,9192],{"class":5360},[5295,9218,8524],{"class":5338},[5295,9220,8494],{"class":5360},[5295,9222,9199],{"class":5338},[5295,9224,5636],{"class":5381},[5295,9226,5624],{"class":5338},[5295,9228,5641],{"class":5305},[5295,9230,5645],{"class":5644},[5295,9232,5641],{"class":5305},[5295,9234,5364],{"class":5338},[5295,9236,9238],{"class":5297,"line":9237},51,[5295,9239,8546],{"class":5338},[5295,9241,9243],{"class":5297,"line":9242},52,[5295,9244,5415],{"class":5338},[5295,9246,9248,9250,9252],{"class":5297,"line":9247},53,[5295,9249,5722],{"class":5301},[5295,9251,5726],{"class":5725},[5295,9253,5364],{"class":5338},[5295,9255,9257],{"class":5297,"line":9256},54,[5295,9258,5655],{"class":5338},[5761,9260,9262,9266,9270,9274,9278,9282],{"title":9261},".\u002FPolymorphicArray",[5765,9263,9265],{"className":9264},[5297],"Усі тварини говорять:",[5765,9267,9269],{"className":9268},[5297],"  Мурка каже Meow",[5765,9271,9273],{"className":9272},[5297],"  Барсік каже Woof",[5765,9275,9277],{"className":9276},[5297],"  Кеша каже Tweet",[5765,9279,9281],{"className":9280},[5297],"  Рижик каже Meow",[5765,9283,9285],{"className":9284},[5297],"  Бобік каже Woof",[5257,9287,9288,9289,9292],{},"Тепер ми можемо обробити всі об'єкти в єдиному циклі, незалежно від їхнього реального типу. Кожен виклик ",[5261,9290,9291],{},"animals[i]->speak()"," автоматично диспетчеризується до правильної реалізації методу завдяки динамічному зв'язуванню.",[7498,9294,9295,9296,9299,9300,9303,9304,9307],{},"У реальних проєктах замість масивів C-style (",[5261,9297,9298],{},"Animal* animals[]",") використовують контейнери STL, такі як ",[5261,9301,9302],{},"std::vector\u003CAnimal*>"," або (краще) ",[5261,9305,9306],{},"std::vector\u003Cstd::unique_ptr\u003CAnimal>>",". Розумні покажчики автоматично керують пам'яттю і запобігають витокам ресурсів. Ми розглянемо їх у майбутніх статтях.",[5929,9309,9311],{"id":9310},"розширюваність-без-змін-існуючого-коду","Розширюваність без змін існуючого коду",[5257,9313,9314,9315,9318,9319,9321],{},"Ключова перевага поліморфних колекцій — ",[5742,9316,9317],{},"розширюваність",". Якщо ми додамо новий клас ",[5261,9320,8352],{},", нам не потрібно змінювати цикл обробки:",[5285,9323,9327],{"className":5287,"code":9324,"filename":9325,"highlights":9326,"language":5290,"meta":5291,"style":5291},"class Snake : public Animal\n{\npublic:\n    Snake(std::string n) : Animal(n) {}\n    const char* speak() const { return \"Hiss\"; }\n};\n\nint main()\n{\n    Cat murka(\"Мурка\");\n    Snake viper(\"Гадюка\");\n    Dog barsik(\"Барсік\");\n    \n    Animal* animals[] = { &murka, &viper, &barsik };\n    \n    \u002F\u002F Той самий цикл без жодних змін!\n    for (int i = 0; i \u003C 3; i++) {\n        std::cout \u003C\u003C animals[i]->getName() \n                  \u003C\u003C \" каже \" \u003C\u003C animals[i]->speak() \u003C\u003C \"\\n\";\n    }\n    \n    return 0;\n}\n","AddingNewType.cpp",[5367,5372,5378,5412,5418,5447,5562],[5261,9328,9329,9342,9346,9350,9375,9396,9400,9404,9413,9418,9431,9446,9459,9464,9487,9491,9496,9524,9546,9574,9578,9582,9591],{"__ignoreMap":5291},[5295,9330,9331,9333,9336,9338,9340],{"class":5297,"line":5298},[5295,9332,5328],{"class":5327},[5295,9334,9335],{"class":5331}," Snake",[5295,9337,5491],{"class":5338},[5295,9339,5494],{"class":5327},[5295,9341,5332],{"class":5331},[5295,9343,9344],{"class":5297,"line":5309},[5295,9345,5339],{"class":5338},[5295,9347,9348],{"class":5297,"line":5317},[5295,9349,5375],{"class":5327},[5295,9351,9352,9355,9357,9359,9361,9363,9365,9367,9369,9371,9373],{"class":5297,"line":5324},[5295,9353,9354],{"class":5381},"    Snake",[5295,9356,5385],{"class":5338},[5295,9358,5388],{"class":5331},[5295,9360,5354],{"class":5338},[5295,9362,5357],{"class":5331},[5295,9364,5395],{"class":5360},[5295,9366,5398],{"class":5338},[5295,9368,5263],{"class":5381},[5295,9370,5385],{"class":5338},[5295,9372,5406],{"class":5360},[5295,9374,5409],{"class":5338},[5295,9376,9377,9379,9381,9383,9385,9387,9389,9391,9394],{"class":5297,"line":5335},[5295,9378,5450],{"class":5327},[5295,9380,5453],{"class":5327},[5295,9382,5456],{"class":5381},[5295,9384,5430],{"class":5338},[5295,9386,5433],{"class":5327},[5295,9388,5436],{"class":5338},[5295,9390,5439],{"class":5301},[5295,9392,9393],{"class":5305}," \"Hiss\"",[5295,9395,5444],{"class":5338},[5295,9397,9398],{"class":5297,"line":5342},[5295,9399,5475],{"class":5338},[5295,9401,9402],{"class":5297,"line":5348},[5295,9403,5321],{"emptyLinePlaceholder":5320},[5295,9405,9407,9409,9411],{"class":9406,"line":5367},[5297,6524],[5295,9408,5666],{"class":5327},[5295,9410,5669],{"class":5381},[5295,9412,5672],{"class":5338},[5295,9414,9416],{"class":9415,"line":5372},[5297,6524],[5295,9417,5339],{"class":5338},[5295,9419,9421,9423,9425,9427,9429],{"class":9420,"line":5378},[5297,6524],[5295,9422,6812],{"class":5331},[5295,9424,6815],{"class":5381},[5295,9426,5385],{"class":5338},[5295,9428,6820],{"class":5305},[5295,9430,5693],{"class":5338},[5295,9432,9434,9436,9439,9441,9444],{"class":9433,"line":5412},[5297,6524],[5295,9435,9354],{"class":5331},[5295,9437,9438],{"class":5381}," viper",[5295,9440,5385],{"class":5338},[5295,9442,9443],{"class":5305},"\"Гадюка\"",[5295,9445,5693],{"class":5338},[5295,9447,9449,9451,9453,9455,9457],{"class":9448,"line":5418},[5297,6524],[5295,9450,5512],{"class":5331},[5295,9452,5685],{"class":5381},[5295,9454,5385],{"class":5338},[5295,9456,6833],{"class":5305},[5295,9458,5693],{"class":5338},[5295,9460,9462],{"class":9461,"line":5447},[5297,6524],[5295,9463,5415],{"class":5338},[5295,9465,9466,9468,9470,9472,9474,9476,9478,9481,9483,9485],{"class":5297,"line":5472},[5295,9467,5382],{"class":5331},[5295,9469,6241],{"class":5327},[5295,9471,9091],{"class":5360},[5295,9473,9094],{"class":5338},[5295,9475,6876],{"class":5360},[5295,9477,9099],{"class":5338},[5295,9479,9480],{"class":5360},"viper",[5295,9482,9099],{"class":5338},[5295,9484,5704],{"class":5360},[5295,9486,9118],{"class":5338},[5295,9488,9489],{"class":5297,"line":5478},[5295,9490,5415],{"class":5338},[5295,9492,9493],{"class":5297,"line":5483},[5295,9494,9495],{"class":5710},"    \u002F\u002F Той самий цикл без жодних змін!\n",[5295,9497,9498,9500,9502,9504,9506,9508,9510,9512,9514,9516,9518,9520,9522],{"class":5297,"line":5499},[5295,9499,8476],{"class":5301},[5295,9501,5805],{"class":5338},[5295,9503,5666],{"class":5327},[5295,9505,8483],{"class":5360},[5295,9507,6276],{"class":5338},[5295,9509,8488],{"class":5725},[5295,9511,8491],{"class":5338},[5295,9513,8494],{"class":5360},[5295,9515,8497],{"class":5338},[5295,9517,8500],{"class":5725},[5295,9519,8491],{"class":5338},[5295,9521,8494],{"class":5360},[5295,9523,8507],{"class":5338},[5295,9525,9526,9528,9530,9532,9534,9536,9538,9540,9542,9544],{"class":5297,"line":5504},[5295,9527,8512],{"class":5331},[5295,9529,5354],{"class":5338},[5295,9531,5609],{"class":5360},[5295,9533,5612],{"class":5338},[5295,9535,9192],{"class":5360},[5295,9537,8524],{"class":5338},[5295,9539,8494],{"class":5360},[5295,9541,9199],{"class":5338},[5295,9543,5621],{"class":5381},[5295,9545,9204],{"class":5338},[5295,9547,9548,9550,9552,9554,9556,9558,9560,9562,9564,9566,9568,9570,9572],{"class":5297,"line":5509},[5295,9549,9210],{"class":5338},[5295,9551,5627],{"class":5305},[5295,9553,5612],{"class":5338},[5295,9555,9192],{"class":5360},[5295,9557,8524],{"class":5338},[5295,9559,8494],{"class":5360},[5295,9561,9199],{"class":5338},[5295,9563,5636],{"class":5381},[5295,9565,5624],{"class":5338},[5295,9567,5641],{"class":5305},[5295,9569,5645],{"class":5644},[5295,9571,5641],{"class":5305},[5295,9573,5364],{"class":5338},[5295,9575,9576],{"class":5297,"line":5535},[5295,9577,8546],{"class":5338},[5295,9579,9580],{"class":5297,"line":5540},[5295,9581,5415],{"class":5338},[5295,9583,9585,9587,9589],{"class":9584,"line":5562},[5297,6524],[5295,9586,5722],{"class":5301},[5295,9588,5726],{"class":5725},[5295,9590,5364],{"class":5338},[5295,9592,9593],{"class":5297,"line":5567},[5295,9594,5655],{"class":5338},[5257,9596,9597],{},"Цикл залишається незмінним — поліморфізм автоматично обробляє новий тип. Це фундаментальна властивість, яка робить великі системи керованими та підтримуваними.",[5252,9599,9601],{"id":9600},"вимоги-до-віртуальних-функцій-та-перевизначення","Вимоги до віртуальних функцій та перевизначення",[5929,9603,9605],{"id":9604},"збіг-сигнатури-обовязкова-умова-перевизначення","Збіг сигнатури: обов'язкова умова перевизначення",[5257,9607,9608,9609,5805,9612,9614,9615,9618],{},"Щоб метод похідного класу вважався ",[5742,9610,9611],{},"перевизначенням",[5807,9613,5913],{},") віртуального методу базового класу, їхні ",[5742,9616,9617],{},"сигнатури"," мають повністю збігатися. Сигнатура включає:",[5834,9620,9621,9624,9627],{},[5837,9622,9623],{},"Ім'я методу",[5837,9625,9626],{},"Кількість і типи параметрів",[5837,9628,9629,9630,9632],{},"Специфікатор ",[5261,9631,5433],{}," (якщо метод константний)",[5257,9634,9635,9636,9639],{},"Якщо сигнатури різняться хоча б в одному аспекті, метод похідного класу ",[5742,9637,9638],{},"не є перевизначенням"," — це окремий, незалежний метод:",[5285,9641,9644],{"className":5287,"code":9642,"filename":9643,"language":5290,"meta":5291,"style":5291},"class Animal\n{\npublic:\n    virtual void makeSound() const { std::cout \u003C\u003C \"???\\n\"; }\n};\n\nclass Dog : public Animal\n{\npublic:\n    \u002F\u002F ❌ Це НЕ перевизначення Animal::makeSound()!\n    \u002F\u002F Відсутній специфікатор const — сигнатури різні\n    void makeSound() { std::cout \u003C\u003C \"Woof\\n\"; }\n};\n\nint main()\n{\n    Dog barsik;\n    Animal* ptr = &barsik;\n    \n    ptr->makeSound();  \u002F\u002F Викличе Animal::makeSound(), виведе \"???\"\n    \n    return 0;\n}\n","SignatureMismatch.cpp",[5261,9645,9646,9652,9656,9660,9693,9697,9701,9713,9717,9721,9726,9731,9756,9760,9764,9772,9776,9784,9799,9803,9818,9822,9830],{"__ignoreMap":5291},[5295,9647,9648,9650],{"class":5297,"line":5298},[5295,9649,5328],{"class":5327},[5295,9651,5332],{"class":5331},[5295,9653,9654],{"class":5297,"line":5309},[5295,9655,5339],{"class":5338},[5295,9657,9658],{"class":5297,"line":5317},[5295,9659,5375],{"class":5327},[5295,9661,9662,9664,9667,9670,9672,9674,9676,9678,9680,9682,9684,9687,9689,9691],{"class":5297,"line":5324},[5295,9663,7354],{"class":5327},[5295,9665,9666],{"class":5327}," void",[5295,9668,9669],{"class":5381}," makeSound",[5295,9671,5430],{"class":5338},[5295,9673,5433],{"class":5327},[5295,9675,5436],{"class":5338},[5295,9677,5388],{"class":5331},[5295,9679,5354],{"class":5338},[5295,9681,5609],{"class":5360},[5295,9683,5612],{"class":5338},[5295,9685,9686],{"class":5305},"\"???",[5295,9688,5645],{"class":5644},[5295,9690,5641],{"class":5305},[5295,9692,5444],{"class":5338},[5295,9694,9695],{"class":5297,"line":5335},[5295,9696,5475],{"class":5338},[5295,9698,9699],{"class":5297,"line":5342},[5295,9700,5321],{"emptyLinePlaceholder":5320},[5295,9702,9703,9705,9707,9709,9711],{"class":5297,"line":5348},[5295,9704,5328],{"class":5327},[5295,9706,5488],{"class":5331},[5295,9708,5491],{"class":5338},[5295,9710,5494],{"class":5327},[5295,9712,5332],{"class":5331},[5295,9714,9715],{"class":5297,"line":5367},[5295,9716,5339],{"class":5338},[5295,9718,9719],{"class":5297,"line":5372},[5295,9720,5375],{"class":5327},[5295,9722,9723],{"class":5297,"line":5378},[5295,9724,9725],{"class":5710},"    \u002F\u002F ❌ Це НЕ перевизначення Animal::makeSound()!\n",[5295,9727,9728],{"class":5297,"line":5412},[5295,9729,9730],{"class":5710},"    \u002F\u002F Відсутній специфікатор const — сигнатури різні\n",[5295,9732,9733,9735,9737,9739,9741,9743,9745,9747,9750,9752,9754],{"class":5297,"line":5418},[5295,9734,6170],{"class":5327},[5295,9736,9669],{"class":5381},[5295,9738,6176],{"class":5338},[5295,9740,5388],{"class":5331},[5295,9742,5354],{"class":5338},[5295,9744,5609],{"class":5360},[5295,9746,5612],{"class":5338},[5295,9748,9749],{"class":5305},"\"Woof",[5295,9751,5645],{"class":5644},[5295,9753,5641],{"class":5305},[5295,9755,5444],{"class":5338},[5295,9757,9758],{"class":5297,"line":5447},[5295,9759,5475],{"class":5338},[5295,9761,9762],{"class":5297,"line":5472},[5295,9763,5321],{"emptyLinePlaceholder":5320},[5295,9765,9766,9768,9770],{"class":5297,"line":5478},[5295,9767,5666],{"class":5327},[5295,9769,5669],{"class":5381},[5295,9771,5672],{"class":5338},[5295,9773,9774],{"class":5297,"line":5483},[5295,9775,5339],{"class":5338},[5295,9777,9778,9780,9782],{"class":5297,"line":5499},[5295,9779,5512],{"class":5331},[5295,9781,5685],{"class":5360},[5295,9783,5364],{"class":5338},[5295,9785,9786,9788,9790,9793,9795,9797],{"class":5297,"line":5504},[5295,9787,5382],{"class":5331},[5295,9789,6241],{"class":5327},[5295,9791,9792],{"class":5360}," ptr",[5295,9794,6247],{"class":5338},[5295,9796,5704],{"class":5360},[5295,9798,5364],{"class":5338},[5295,9800,9801],{"class":5297,"line":5509},[5295,9802,5415],{"class":5338},[5295,9804,9805,9808,9810,9813,9815],{"class":5297,"line":5535},[5295,9806,9807],{"class":5360},"    ptr",[5295,9809,6339],{"class":5338},[5295,9811,9812],{"class":5381},"makeSound",[5295,9814,6534],{"class":5338},[5295,9816,9817],{"class":5710},"  \u002F\u002F Викличе Animal::makeSound(), виведе \"???\"\n",[5295,9819,9820],{"class":5297,"line":5540},[5295,9821,5415],{"class":5338},[5295,9823,9824,9826,9828],{"class":5297,"line":5562},[5295,9825,5722],{"class":5301},[5295,9827,5726],{"class":5725},[5295,9829,5364],{"class":5338},[5295,9831,9832],{"class":5297,"line":5567},[5295,9833,5655],{"class":5338},[5257,9835,9836,9837,9840,9841,9843,9844,9847,9848,9850,9851,9854,9855,5618],{},"У цьому прикладі ",[5261,9838,9839],{},"Animal::makeSound()"," позначено як ",[5261,9842,5433],{},", а ",[5261,9845,9846],{},"Dog::makeSound()"," — ні. Сигнатури не збігаються, тому ",[5261,9849,9846],{}," — це окремий метод, а не перевизначення. Виклик через ",[5261,9852,9853],{},"ptr->makeSound()"," виконає ",[5261,9856,9839],{},[6601,9858,9859,9862,9863,9865,9866,9868],{},[5742,9860,9861],{},"Типова пастка",": забути ",[5261,9864,5433],{}," у перевизначенні константного віртуального методу. Код скомпілюється без помилок, але поліморфізм не працюватиме — компілятор розглядатиме це як незалежний метод. У наступній статті ми вивчимо специфікатор ",[5261,9867,5913],{}," (C++11), який змушує компілятор перевірити, чи дійсно метод є перевизначенням, і видати помилку, якщо сигнатури не збігаються.",[5929,9870,9872],{"id":9871},"збіг-типу-повернення","Збіг типу повернення",[5257,9874,9875],{},"Тип повернення віртуального методу та його перевизначення також має збігатися:",[5285,9877,9880],{"className":5287,"code":9878,"filename":9879,"language":5290,"meta":5291,"style":5291},"class Animal\n{\npublic:\n    virtual int getAge() const { return 0; }\n};\n\nclass Dog : public Animal\n{\npublic:\n    \u002F\u002F ❌ Помилка компіляції: тип повернення double не збігається з int\n    virtual double getAge() const { return 5.5; }\n};\n","ReturnTypeMismatch.cpp",[5261,9881,9882,9888,9892,9896,9918,9922,9926,9938,9942,9946,9951,9973],{"__ignoreMap":5291},[5295,9883,9884,9886],{"class":5297,"line":5298},[5295,9885,5328],{"class":5327},[5295,9887,5332],{"class":5331},[5295,9889,9890],{"class":5297,"line":5309},[5295,9891,5339],{"class":5338},[5295,9893,9894],{"class":5297,"line":5317},[5295,9895,5375],{"class":5327},[5295,9897,9898,9900,9903,9906,9908,9910,9912,9914,9916],{"class":5297,"line":5324},[5295,9899,7354],{"class":5327},[5295,9901,9902],{"class":5327}," int",[5295,9904,9905],{"class":5381}," getAge",[5295,9907,5430],{"class":5338},[5295,9909,5433],{"class":5327},[5295,9911,5436],{"class":5338},[5295,9913,5439],{"class":5301},[5295,9915,5726],{"class":5725},[5295,9917,5444],{"class":5338},[5295,9919,9920],{"class":5297,"line":5335},[5295,9921,5475],{"class":5338},[5295,9923,9924],{"class":5297,"line":5342},[5295,9925,5321],{"emptyLinePlaceholder":5320},[5295,9927,9928,9930,9932,9934,9936],{"class":5297,"line":5348},[5295,9929,5328],{"class":5327},[5295,9931,5488],{"class":5331},[5295,9933,5491],{"class":5338},[5295,9935,5494],{"class":5327},[5295,9937,5332],{"class":5331},[5295,9939,9940],{"class":5297,"line":5367},[5295,9941,5339],{"class":5338},[5295,9943,9944],{"class":5297,"line":5372},[5295,9945,5375],{"class":5327},[5295,9947,9948],{"class":5297,"line":5378},[5295,9949,9950],{"class":5710},"    \u002F\u002F ❌ Помилка компіляції: тип повернення double не збігається з int\n",[5295,9952,9953,9955,9958,9960,9962,9964,9966,9968,9971],{"class":5297,"line":5412},[5295,9954,7354],{"class":5327},[5295,9956,9957],{"class":5327}," double",[5295,9959,9905],{"class":5381},[5295,9961,5430],{"class":5338},[5295,9963,5433],{"class":5327},[5295,9965,5436],{"class":5338},[5295,9967,5439],{"class":5301},[5295,9969,9970],{"class":5725}," 5.5",[5295,9972,5444],{"class":5338},[5295,9974,9975],{"class":5297,"line":5418},[5295,9976,5475],{"class":5338},[5257,9978,9979,9980,5755,9983,9843,9986,5755,9989,9991],{},"Компілятор видасть помилку, адже ",[5261,9981,9982],{},"Dog::getAge()",[5261,9984,9985],{},"double",[5261,9987,9988],{},"Animal::getAge()",[5261,9990,5666],{},". Це не є валідним перевизначенням.",[5257,9993,9994,9997],{},[5742,9995,9996],{},"Виняток",": коваріантні типи повернення, які ми розглянемо далі.",[5252,9999,10001],{"id":10000},"коваріантні-типи-повернення-елегантна-гнучкість","Коваріантні типи повернення: елегантна гнучкість",[5929,10003,10005],{"id":10004},"мотивація-повернення-похідного-типу","Мотивація: повернення похідного типу",[5257,10007,10008,10009,10011,10012,10014,10015,10018],{},"Іноді зручно, щоб перевизначений метод повертав більш специфічний тип, ніж базовий метод. Розглянемо ієрархію ",[5261,10010,5263],{}," → ",[5261,10013,5271],{}," і метод ",[5261,10016,10017],{},"clone()",", який повертає копію об'єкта:",[5285,10020,10023],{"className":5287,"code":10021,"filename":10022,"language":5290,"meta":5291,"style":5291},"class Animal\n{\npublic:\n    virtual Animal* clone() const\n    {\n        return new Animal(*this);\n    }\n};\n\nclass Dog : public Animal\n{\npublic:\n    \u002F\u002F Хотілося б повернути Dog*, але базовий метод повертає Animal*\n    virtual Animal* clone() const\n    {\n        return new Dog(*this);\n    }\n};\n","CloningProblem.cpp",[5261,10024,10025,10031,10035,10039,10055,10060,10078,10082,10086,10090,10102,10106,10110,10115,10129,10133,10147,10151],{"__ignoreMap":5291},[5295,10026,10027,10029],{"class":5297,"line":5298},[5295,10028,5328],{"class":5327},[5295,10030,5332],{"class":5331},[5295,10032,10033],{"class":5297,"line":5309},[5295,10034,5339],{"class":5338},[5295,10036,10037],{"class":5297,"line":5317},[5295,10038,5375],{"class":5327},[5295,10040,10041,10043,10045,10047,10050,10052],{"class":5297,"line":5324},[5295,10042,7354],{"class":5327},[5295,10044,5585],{"class":5331},[5295,10046,6241],{"class":5327},[5295,10048,10049],{"class":5381}," clone",[5295,10051,5430],{"class":5338},[5295,10053,10054],{"class":5327},"const\n",[5295,10056,10057],{"class":5297,"line":5335},[5295,10058,10059],{"class":5338},"    {\n",[5295,10061,10062,10065,10068,10070,10073,10076],{"class":5297,"line":5342},[5295,10063,10064],{"class":5301},"        return",[5295,10066,10067],{"class":5301}," new",[5295,10069,5585],{"class":5381},[5295,10071,10072],{"class":5338},"(*",[5295,10074,10075],{"class":5327},"this",[5295,10077,5693],{"class":5338},[5295,10079,10080],{"class":5297,"line":5348},[5295,10081,8546],{"class":5338},[5295,10083,10084],{"class":5297,"line":5367},[5295,10085,5475],{"class":5338},[5295,10087,10088],{"class":5297,"line":5372},[5295,10089,5321],{"emptyLinePlaceholder":5320},[5295,10091,10092,10094,10096,10098,10100],{"class":5297,"line":5378},[5295,10093,5328],{"class":5327},[5295,10095,5488],{"class":5331},[5295,10097,5491],{"class":5338},[5295,10099,5494],{"class":5327},[5295,10101,5332],{"class":5331},[5295,10103,10104],{"class":5297,"line":5412},[5295,10105,5339],{"class":5338},[5295,10107,10108],{"class":5297,"line":5418},[5295,10109,5375],{"class":5327},[5295,10111,10112],{"class":5297,"line":5447},[5295,10113,10114],{"class":5710},"    \u002F\u002F Хотілося б повернути Dog*, але базовий метод повертає Animal*\n",[5295,10116,10117,10119,10121,10123,10125,10127],{"class":5297,"line":5472},[5295,10118,7354],{"class":5327},[5295,10120,5585],{"class":5331},[5295,10122,6241],{"class":5327},[5295,10124,10049],{"class":5381},[5295,10126,5430],{"class":5338},[5295,10128,10054],{"class":5327},[5295,10130,10131],{"class":5297,"line":5478},[5295,10132,10059],{"class":5338},[5295,10134,10135,10137,10139,10141,10143,10145],{"class":5297,"line":5483},[5295,10136,10064],{"class":5301},[5295,10138,10067],{"class":5301},[5295,10140,5488],{"class":5381},[5295,10142,10072],{"class":5338},[5295,10144,10075],{"class":5327},[5295,10146,5693],{"class":5338},[5295,10148,10149],{"class":5297,"line":5499},[5295,10150,8546],{"class":5338},[5295,10152,10153],{"class":5297,"line":5504},[5295,10154,5475],{"class":5338},[5257,10156,6584,10157,5755,10160,10162,10163,10165,10166,10169],{},[5261,10158,10159],{},"Dog::clone()",[5261,10161,6467],{},", хоча фактично створює об'єкт ",[5261,10164,5271],{},". Це не зовсім природньо — користувачу доведеться вручну приводити результат до ",[5261,10167,10168],{},"Dog*",":",[5285,10171,10173],{"className":5287,"code":10172,"language":5290,"meta":5291,"style":5291},"Dog barsik;\nDog* copy = static_cast\u003CDog*>(barsik.clone());  \u002F\u002F Незручне приведення\n",[5261,10174,10175,10183],{"__ignoreMap":5291},[5295,10176,10177,10179,10181],{"class":5297,"line":5298},[5295,10178,5271],{"class":5360},[5295,10180,5685],{"class":5360},[5295,10182,5364],{"class":5338},[5295,10184,10185,10187,10190,10193,10195,10198,10201,10203,10206,10208,10210,10213,10216],{"class":5297,"line":5309},[5295,10186,5271],{"class":5360},[5295,10188,10189],{"class":5338},"* ",[5295,10191,10192],{"class":5360},"copy",[5295,10194,6276],{"class":5338},[5295,10196,10197],{"class":5327},"static_cast",[5295,10199,10200],{"class":5338},"\u003C",[5295,10202,5271],{"class":5360},[5295,10204,10205],{"class":5338},"*>(",[5295,10207,5704],{"class":5360},[5295,10209,5618],{"class":5338},[5295,10211,10212],{"class":5381},"clone",[5295,10214,10215],{"class":5338},"());",[5295,10217,10218],{"class":5710},"  \u002F\u002F Незручне приведення\n",[5929,10220,10222],{"id":10221},"коваріантні-типи-легальна-зміна-типу-повернення","Коваріантні типи: легальна зміна типу повернення",[5257,10224,10225,10226,10229,10230,5805,10233,6471],{},"C++ дозволяє перевизначеному методу повертати ",[5742,10227,10228],{},"покажчик або посилання на похідний клас"," замість покажчика на базовий клас. Це називається ",[5742,10231,10232],{},"коваріантним типом повернення",[5807,10234,5922],{},[5285,10236,10239],{"className":5287,"code":10237,"filename":10238,"language":5290,"meta":5291,"style":5291},"class Animal\n{\npublic:\n    virtual Animal* clone() const\n    {\n        return new Animal(*this);\n    }\n};\n\nclass Dog : public Animal\n{\npublic:\n    \u002F\u002F ✅ Коваріантний тип повернення: Dog* замість Animal*\n    virtual Dog* clone() const override\n    {\n        return new Dog(*this);\n    }\n};\n\nint main()\n{\n    Dog barsik;\n    Dog* copy = barsik.clone();  \u002F\u002F Природно і без приведення типів!\n    \n    delete copy;\n    return 0;\n}\n","CovariantReturn.cpp",[5261,10240,10241,10247,10251,10255,10269,10273,10287,10291,10295,10299,10311,10315,10319,10324,10341,10345,10359,10363,10367,10371,10379,10383,10391,10413,10417,10426,10434],{"__ignoreMap":5291},[5295,10242,10243,10245],{"class":5297,"line":5298},[5295,10244,5328],{"class":5327},[5295,10246,5332],{"class":5331},[5295,10248,10249],{"class":5297,"line":5309},[5295,10250,5339],{"class":5338},[5295,10252,10253],{"class":5297,"line":5317},[5295,10254,5375],{"class":5327},[5295,10256,10257,10259,10261,10263,10265,10267],{"class":5297,"line":5324},[5295,10258,7354],{"class":5327},[5295,10260,5585],{"class":5331},[5295,10262,6241],{"class":5327},[5295,10264,10049],{"class":5381},[5295,10266,5430],{"class":5338},[5295,10268,10054],{"class":5327},[5295,10270,10271],{"class":5297,"line":5335},[5295,10272,10059],{"class":5338},[5295,10274,10275,10277,10279,10281,10283,10285],{"class":5297,"line":5342},[5295,10276,10064],{"class":5301},[5295,10278,10067],{"class":5301},[5295,10280,5585],{"class":5381},[5295,10282,10072],{"class":5338},[5295,10284,10075],{"class":5327},[5295,10286,5693],{"class":5338},[5295,10288,10289],{"class":5297,"line":5348},[5295,10290,8546],{"class":5338},[5295,10292,10293],{"class":5297,"line":5367},[5295,10294,5475],{"class":5338},[5295,10296,10297],{"class":5297,"line":5372},[5295,10298,5321],{"emptyLinePlaceholder":5320},[5295,10300,10301,10303,10305,10307,10309],{"class":5297,"line":5378},[5295,10302,5328],{"class":5327},[5295,10304,5488],{"class":5331},[5295,10306,5491],{"class":5338},[5295,10308,5494],{"class":5327},[5295,10310,5332],{"class":5331},[5295,10312,10313],{"class":5297,"line":5412},[5295,10314,5339],{"class":5338},[5295,10316,10317],{"class":5297,"line":5418},[5295,10318,5375],{"class":5327},[5295,10320,10321],{"class":5297,"line":5447},[5295,10322,10323],{"class":5710},"    \u002F\u002F ✅ Коваріантний тип повернення: Dog* замість Animal*\n",[5295,10325,10326,10328,10330,10332,10334,10336,10338],{"class":5297,"line":5472},[5295,10327,7354],{"class":5327},[5295,10329,5488],{"class":5331},[5295,10331,6241],{"class":5327},[5295,10333,10049],{"class":5381},[5295,10335,5430],{"class":5338},[5295,10337,5433],{"class":5327},[5295,10339,10340],{"class":5327}," override\n",[5295,10342,10343],{"class":5297,"line":5478},[5295,10344,10059],{"class":5338},[5295,10346,10347,10349,10351,10353,10355,10357],{"class":5297,"line":5483},[5295,10348,10064],{"class":5301},[5295,10350,10067],{"class":5301},[5295,10352,5488],{"class":5381},[5295,10354,10072],{"class":5338},[5295,10356,10075],{"class":5327},[5295,10358,5693],{"class":5338},[5295,10360,10361],{"class":5297,"line":5499},[5295,10362,8546],{"class":5338},[5295,10364,10365],{"class":5297,"line":5504},[5295,10366,5475],{"class":5338},[5295,10368,10369],{"class":5297,"line":5509},[5295,10370,5321],{"emptyLinePlaceholder":5320},[5295,10372,10373,10375,10377],{"class":5297,"line":5535},[5295,10374,5666],{"class":5327},[5295,10376,5669],{"class":5381},[5295,10378,5672],{"class":5338},[5295,10380,10381],{"class":5297,"line":5540},[5295,10382,5339],{"class":5338},[5295,10384,10385,10387,10389],{"class":5297,"line":5562},[5295,10386,5512],{"class":5331},[5295,10388,5685],{"class":5360},[5295,10390,5364],{"class":5338},[5295,10392,10393,10395,10397,10400,10402,10404,10406,10408,10410],{"class":5297,"line":5567},[5295,10394,5512],{"class":5331},[5295,10396,6241],{"class":5327},[5295,10398,10399],{"class":5360}," copy",[5295,10401,6276],{"class":5338},[5295,10403,5704],{"class":5360},[5295,10405,5618],{"class":5338},[5295,10407,10212],{"class":5381},[5295,10409,6534],{"class":5338},[5295,10411,10412],{"class":5710},"  \u002F\u002F Природно і без приведення типів!\n",[5295,10414,10415],{"class":5297,"line":5572},[5295,10416,5415],{"class":5338},[5295,10418,10419,10422,10424],{"class":5297,"line":5597},[5295,10420,10421],{"class":5301},"    delete",[5295,10423,10399],{"class":5360},[5295,10425,5364],{"class":5338},[5295,10427,10428,10430,10432],{"class":5297,"line":5602},[5295,10429,5722],{"class":5301},[5295,10431,5726],{"class":5725},[5295,10433,5364],{"class":5338},[5295,10435,10436],{"class":5297,"line":5652},[5295,10437,5655],{"class":5338},[5257,10439,10440,10441,5755,10443,10445,10446,10448,10449,10451,10452,10454,10455,5618],{},"Тепер ",[5261,10442,10159],{},[5261,10444,10168],{},", що є більш конкретним типом, ніж ",[5261,10447,6467],{},". Компілятор дозволяє таку зміну, адже ",[5261,10450,10168],{}," можна неявно перетворити на ",[5261,10453,6467],{}," (upcasting). Це зберігає сумісність із базовим інтерфейсом, але надає зручніший тип під час прямого виклику ",[5261,10456,10457],{},"barsik.clone()",[6448,10459,10460,10466,10477],{},[5257,10461,10462,10465],{},[5742,10463,10464],{},"Умови коваріантності",": тип повернення перевизначеного методу може бути покажчиком або посиланням на похідний клас лише якщо:",[7285,10467,10468,10471,10474],{},[5837,10469,10470],{},"Базовий метод повертає покажчик або посилання (не значення)",[5837,10472,10473],{},"Похідний клас є нащадком класу, який повертає базовий метод",[5837,10475,10476],{},"Повертається саме покажчик\u002Fпосилання, а не значення",[5257,10478,10479,10480,10483,10484,5824],{},"Це не працює для повернення за значенням (",[5261,10481,10482],{},"Animal clone()"," не може бути перевизначено як ",[5261,10485,10486],{},"Dog clone()",[5252,10488,10490],{"id":10489},"не-викликайте-віртуальні-функції-в-конструкторах-та-деструкторах","Не викликайте віртуальні функції в конструкторах та деструкторах",[5929,10492,10494],{"id":10493},"підступна-пастка-ініціалізації","Підступна пастка ініціалізації",[5257,10496,10497],{},"Розглянемо код, де базовий конструктор викликає віртуальний метод:",[5285,10499,10502],{"className":5287,"code":10500,"filename":10501,"language":5290,"meta":5291,"style":5291},"#include \u003Ciostream>\n\nclass Animal\n{\npublic:\n    Animal()\n    {\n        std::cout \u003C\u003C \"Створення Animal, звук: \" \u003C\u003C speak() \u003C\u003C \"\\n\";\n    }\n    \n    virtual const char* speak() const { return \"???\"; }\n};\n\nclass Dog : public Animal\n{\npublic:\n    Dog()\n    {\n        std::cout \u003C\u003C \"Створення Dog, звук: \" \u003C\u003C speak() \u003C\u003C \"\\n\";\n    }\n    \n    const char* speak() const { return \"Woof\"; }\n};\n\nint main()\n{\n    Dog barsik;\n    return 0;\n}\n","VirtualInConstructor.cpp",[5261,10503,10504,10510,10514,10520,10524,10528,10534,10538,10565,10569,10573,10595,10599,10603,10615,10619,10623,10629,10633,10660,10664,10668,10688,10692,10696,10704,10708,10716,10724],{"__ignoreMap":5291},[5295,10505,10506,10508],{"class":5297,"line":5298},[5295,10507,5302],{"class":5301},[5295,10509,5306],{"class":5305},[5295,10511,10512],{"class":5297,"line":5309},[5295,10513,5321],{"emptyLinePlaceholder":5320},[5295,10515,10516,10518],{"class":5297,"line":5317},[5295,10517,5328],{"class":5327},[5295,10519,5332],{"class":5331},[5295,10521,10522],{"class":5297,"line":5324},[5295,10523,5339],{"class":5338},[5295,10525,10526],{"class":5297,"line":5335},[5295,10527,5375],{"class":5327},[5295,10529,10530,10532],{"class":5297,"line":5342},[5295,10531,5382],{"class":5381},[5295,10533,5672],{"class":5338},[5295,10535,10536],{"class":5297,"line":5348},[5295,10537,10059],{"class":5338},[5295,10539,10540,10542,10544,10546,10548,10551,10553,10555,10557,10559,10561,10563],{"class":5297,"line":5367},[5295,10541,8512],{"class":5331},[5295,10543,5354],{"class":5338},[5295,10545,5609],{"class":5360},[5295,10547,5612],{"class":5338},[5295,10549,10550],{"class":5305},"\"Створення Animal, звук: \"",[5295,10552,5612],{"class":5338},[5295,10554,5636],{"class":5381},[5295,10556,5624],{"class":5338},[5295,10558,5641],{"class":5305},[5295,10560,5645],{"class":5644},[5295,10562,5641],{"class":5305},[5295,10564,5364],{"class":5338},[5295,10566,10567],{"class":5297,"line":5372},[5295,10568,8546],{"class":5338},[5295,10570,10571],{"class":5297,"line":5378},[5295,10572,5415],{"class":5338},[5295,10574,10575,10577,10579,10581,10583,10585,10587,10589,10591,10593],{"class":5297,"line":5412},[5295,10576,7354],{"class":5327},[5295,10578,7357],{"class":5327},[5295,10580,5453],{"class":5327},[5295,10582,5456],{"class":5381},[5295,10584,5430],{"class":5338},[5295,10586,5433],{"class":5327},[5295,10588,5436],{"class":5338},[5295,10590,5439],{"class":5301},[5295,10592,5467],{"class":5305},[5295,10594,5444],{"class":5338},[5295,10596,10597],{"class":5297,"line":5418},[5295,10598,5475],{"class":5338},[5295,10600,10601],{"class":5297,"line":5447},[5295,10602,5321],{"emptyLinePlaceholder":5320},[5295,10604,10605,10607,10609,10611,10613],{"class":5297,"line":5472},[5295,10606,5328],{"class":5327},[5295,10608,5488],{"class":5331},[5295,10610,5491],{"class":5338},[5295,10612,5494],{"class":5327},[5295,10614,5332],{"class":5331},[5295,10616,10617],{"class":5297,"line":5478},[5295,10618,5339],{"class":5338},[5295,10620,10621],{"class":5297,"line":5483},[5295,10622,5375],{"class":5327},[5295,10624,10625,10627],{"class":5297,"line":5499},[5295,10626,5512],{"class":5381},[5295,10628,5672],{"class":5338},[5295,10630,10631],{"class":5297,"line":5504},[5295,10632,10059],{"class":5338},[5295,10634,10635,10637,10639,10641,10643,10646,10648,10650,10652,10654,10656,10658],{"class":5297,"line":5509},[5295,10636,8512],{"class":5331},[5295,10638,5354],{"class":5338},[5295,10640,5609],{"class":5360},[5295,10642,5612],{"class":5338},[5295,10644,10645],{"class":5305},"\"Створення Dog, звук: \"",[5295,10647,5612],{"class":5338},[5295,10649,5636],{"class":5381},[5295,10651,5624],{"class":5338},[5295,10653,5641],{"class":5305},[5295,10655,5645],{"class":5644},[5295,10657,5641],{"class":5305},[5295,10659,5364],{"class":5338},[5295,10661,10662],{"class":5297,"line":5535},[5295,10663,8546],{"class":5338},[5295,10665,10666],{"class":5297,"line":5540},[5295,10667,5415],{"class":5338},[5295,10669,10670,10672,10674,10676,10678,10680,10682,10684,10686],{"class":5297,"line":5562},[5295,10671,5450],{"class":5327},[5295,10673,5453],{"class":5327},[5295,10675,5456],{"class":5381},[5295,10677,5430],{"class":5338},[5295,10679,5433],{"class":5327},[5295,10681,5436],{"class":5338},[5295,10683,5439],{"class":5301},[5295,10685,5557],{"class":5305},[5295,10687,5444],{"class":5338},[5295,10689,10690],{"class":5297,"line":5567},[5295,10691,5475],{"class":5338},[5295,10693,10694],{"class":5297,"line":5572},[5295,10695,5321],{"emptyLinePlaceholder":5320},[5295,10697,10698,10700,10702],{"class":5297,"line":5597},[5295,10699,5666],{"class":5327},[5295,10701,5669],{"class":5381},[5295,10703,5672],{"class":5338},[5295,10705,10706],{"class":5297,"line":5602},[5295,10707,5339],{"class":5338},[5295,10709,10710,10712,10714],{"class":5297,"line":5652},[5295,10711,5512],{"class":5331},[5295,10713,5685],{"class":5360},[5295,10715,5364],{"class":5338},[5295,10717,10718,10720,10722],{"class":5297,"line":5658},[5295,10719,5722],{"class":5301},[5295,10721,5726],{"class":5725},[5295,10723,5364],{"class":5338},[5295,10725,10726],{"class":5297,"line":5663},[5295,10727,5655],{"class":5338},[5257,10729,10730,10731,10733,10734,10736,10737,10739,10740,10742],{},"Інтуїтивно здається, що виклик ",[5261,10732,5275],{}," у конструкторі ",[5261,10735,5263],{}," має викликати ",[5261,10738,5754],{},", адже ми створюємо об'єкт ",[5261,10741,5271],{},". Проте результат виконання програми інший:",[5761,10744,10746,10750],{"title":10745},".\u002FVirtualInConstructor",[5765,10747,10749],{"className":10748},[5297],"Створення Animal, звук: ???",[5765,10751,10753],{"className":10752},[5297],"Створення Dog, звук: Woof",[5257,10755,10756,10757,10733,10759,10761,10762,10764,10765,10767],{},"Виклик ",[5261,10758,5275],{},[5261,10760,5263],{}," виконав ",[5261,10763,5795],{},", а не ",[5261,10766,5754],{},". Чому?",[5929,10769,10771],{"id":10770},"порядок-конструювання-та-проблема-неповного-обєкта","Порядок конструювання та проблема неповного об'єкта",[5257,10773,10774],{},"Пригадаємо порядок конструювання об'єкта похідного класу:",[7285,10776,10777,10787],{},[5837,10778,10779,10780,10783,10784,10786],{},"Спочатку викликається конструктор ",[5742,10781,10782],{},"базового"," класу (",[5261,10785,5263],{},")",[5837,10788,10789,10790,10783,10793,10786],{},"Потім викликається конструктор ",[5742,10791,10792],{},"похідного",[5261,10794,5271],{},[5257,10796,10797,10798,7913,10800,10806,10807,10809,10810,10812,10813,10815,10816,10764,10818,5618],{},"Коли виконується конструктор ",[5261,10799,5263],{},[5742,10801,10802,10803,10805],{},"частина ",[5261,10804,5271],{}," ще не існує"," — поля класу ",[5261,10808,5271],{}," не ініціалізовані, а віртуальна таблиця (механізм, що забезпечує динамічне зв'язування) вказує на ",[5261,10811,5263],{},", а не на ",[5261,10814,5271],{},". З точки зору системи типів у цей момент об'єкт є ",[5261,10817,5263],{},[5261,10819,5271],{},[5257,10821,10822,10823,10826,10827,10829,10830,10832],{},"Тому виклик віртуальної функції з конструктора базового класу завжди виконує ",[5742,10824,10825],{},"реалізацію базового класу",", навіть якщо ви створюєте об'єкт похідного класу. Це захисний механізм: якби С++ дозволив викликати ",[5261,10828,5754],{}," у цей момент, метод міг би звернутися до неініціалізованих полів класу ",[5261,10831,5271],{},", що призвело б до Undefined Behavior.",[10834,10835,10836,10839,10840,10843],"caution",{},[5742,10837,10838],{},"Категорична заборона",": ніколи не викликайте віртуальні функції в тілі конструкторів або деструкторів. Поведінка не відповідає інтуїтивним очікуванням — завжди виконується реалізація поточного класу, а не найпохіднішого. Якщо вам потрібна поліморфна ініціалізація, винесіть логіку в окремий метод ",[5261,10841,10842],{},"init()",", який викликається після конструювання об'єкта.",[5257,10845,10846],{},"Аналогічна проблема існує з деструкторами: коли виконується деструктор базового класу, частина похідного класу вже знищена, тому виклик віртуальної функції знову виконає реалізацію базового класу.",[5252,10848,10850],{"id":10849},"продуктивність-віртуальних-функцій-немає-безкоштовних-обідів","Продуктивність віртуальних функцій: немає безкоштовних обідів",[5929,10852,10854],{"id":10853},"накладні-витрати-динамічного-звязування","Накладні витрати динамічного зв'язування",[5257,10856,10857],{},"Віртуальні функції — це потужний інструмент, але вони не безкоштовні. Динамічне зв'язування вимагає додаткових ресурсів:",[7285,10859,10860,10873,10894],{},[5837,10861,10862,10865,10866,5805,10869,10872],{},[5742,10863,10864],{},"Додатковий покажчик у кожному об'єкті",": кожен екземпляр класу з віртуальними функціями зберігає прихований покажчик на ",[5742,10867,10868],{},"віртуальну таблицю",[5807,10870,10871],{},"vtable",") — структуру даних, що містить адреси всіх віртуальних методів класу. Це збільшує розмір об'єкта на 8 байт (64-бітна система).",[5837,10874,10875,10878,10879,10890,10893],{},[5742,10876,10877],{},"Непрямий виклик через vtable",": замість прямого виклику функції за фіксованою адресою компілятор генерує код, який:",[5834,10880,10881,10884,10887],{},[5837,10882,10883],{},"Читає покажчик на vtable з об'єкта",[5837,10885,10886],{},"Знаходить у vtable адресу потрібного методу",[5837,10888,10889],{},"Виконує непрямий виклик за цією адресою",[10891,10892],"br",{},"Це додає кілька машинних інструкцій до кожного виклику віртуальної функції.",[5837,10895,10896,10899,10900,10903],{},[5742,10897,10898],{},"Обмеження оптимізацій",": компілятор не може вбудувати (",[5807,10901,10902],{},"inline",") виклик віртуальної функції, адже не знає під час компіляції, яка реалізація буде викликана. Це блокує низку оптимізацій.",[10905,10906],"debugger-view",{":variables":10907,"title":10908},"[{\"name\": \"sizeof(AnimalNoVirtual)\", \"type\": \"size_t\", \"value\": \"32\"}, {\"name\": \"sizeof(AnimalWithVirtual)\", \"type\": \"size_t\", \"value\": \"40\"}]","Розмір об'єкта з віртуальними функціями",[5929,10910,10912],{"id":10911},"коли-використовувати-віртуальні-функції","Коли використовувати віртуальні функції",[5257,10914,10915,10916,10919],{},"Незважаючи на накладні витрати, віртуальні функції є ",[5742,10917,10918],{},"правильним вибором"," у більшості випадків, коли потрібен поліморфізм. Накладні витрати мізерні порівняно з перевагами гнучкості та розширюваності коду.",[5257,10921,10922,10169],{},[5742,10923,10924],{},"Використовуйте віртуальні функції, коли",[5834,10926,10927,10930,10933],{},[5837,10928,10929],{},"Потрібна поліморфна поведінка: різні класи реагують на один виклик по-різному",[5837,10931,10932],{},"Ви працюєте з колекціями покажчиків на базовий клас",[5837,10934,10935],{},"Архітектура системи базується на абстракціях та інтерфейсах",[5257,10937,10938,10169],{},[5742,10939,10940],{},"Уникайте віртуальних функцій, коли",[5834,10942,10943,10949,10952],{},[5837,10944,10945,10946,10786],{},"Клас не призначений для наслідування (позначте його ",[5261,10947,10948],{},"final",[5837,10950,10951],{},"Критична продуктивність у вузькому місці коду (гарячий цикл, що виконується мільйони разів на секунду)",[5837,10953,10954],{},"Клас є простою структурою даних без поведінкової логіки",[7498,10956,10957,10960,10961,10964],{},[5742,10958,10959],{},"Правило",": якщо клас має хоча б один віртуальний метод, він майже напевно потребує ",[5742,10962,10963],{},"віртуального деструктора",". Про це ми детально поговоримо в наступній статті — невіртуальний деструктор у поліморфному класі призводить до витоків пам'яті та Undefined Behavior при видаленні об'єкта через покажчик на базовий клас.",[5252,10966,10968],{"id":10967},"резюме","Резюме",[5257,10970,10971],{},"У цій статті ми дослідили фундаментальний механізм C++, що реалізує поліморфізм — третій стовп об'єктно-орієнтованого програмування. Ми навчилися:",[5826,10973,10974,10979,10984,10991],{},[5829,10975,10978],{"icon":10976,"title":10977},"i-lucide-arrow-up","🔗 Upcasting","Покажчик або посилання на базовий клас може безпечно адресувати об'єкт похідного класу. Це природне перетворення, що відображає семантику наслідування («похідний клас є різновидом базового класу»).",[5829,10980,10983],{"icon":10981,"title":10982},"i-lucide-link","⚙️ Статичне зв'язування","За замовчуванням виклик методу через покажчик на базовий клас виконує реалізацію базового класу, навіть якщо покажчик адресує об'єкт похідного класу. Рішення приймається під час компіляції на основі типу покажчика.",[5829,10985,7305,10988,10990],{"icon":10986,"title":10987},"i-lucide-sparkles","🎭 Віртуальні функції",[5261,10989,5852],{}," активує динамічне зв'язування: виклик методу диспетчеризується до правильної реалізації на основі реального типу об'єкта в пам'яті під час виконання програми.",[5829,10992,10995],{"icon":10993,"title":10994},"i-lucide-boxes","📦 Поліморфні колекції","Масив покажчиків на базовий клас дозволяє зберігати та обробляти об'єкти різних похідних класів у єдиному циклі. Це забезпечує розширюваність без зміни існуючого коду.",[5257,10997,10998,10169],{},[5742,10999,11000],{},"Ключові правила, які слід запам'ятати",[7285,11002,11003,11009,11014,11017,11020],{},[5837,11004,11005,11006,11008],{},"Позначайте методи як ",[5261,11007,5852],{}," у базовому класі, якщо очікуєте, що похідні класи змінюватимуть їхню поведінку",[5837,11010,11011,11012,10786],{},"Сигнатури віртуального методу та його перевизначення мають повністю збігатися (включно з ",[5261,11013,5433],{},[5837,11015,11016],{},"Ніколи не викликайте віртуальні функції в конструкторах та деструкторах",[5837,11018,11019],{},"Якщо клас має віртуальні методи, він майже напевно потребує віртуального деструктора",[5837,11021,11022],{},"Поліморфізм має невеликі накладні витрати, але забезпечує величезну гнучкість архітектури",[5257,11024,11025,11026,5268,11028,11030,11031,11034],{},"У наступній статті ми вивчимо специфікатори ",[5261,11027,5913],{},[5261,11029,10948],{}," (C++11), які підвищують безпеку та ясність коду при роботі з віртуальними функціями, а також детально розберемо ",[5742,11032,11033],{},"віртуальні деструктори"," — критично важливий механізм для коректного видалення поліморфних об'єктів через покажчики на базовий клас.",[11036,11037,11038,11065,11093,11114,11132],"accordion",{},[11039,11040,11043,11044,11047,11048,7913,11051,7913,11054,11057,11058,11061,11062,11064],"accordion-item",{"icon":11041,"label":11042},"i-lucide-clipboard-list","📋 Завдання 1: Поліморфна геометрія","Реалізуйте ієрархію геометричних фігур із базовим класом ",[5261,11045,11046],{},"Shape"," та похідними класами ",[5261,11049,11050],{},"Circle",[5261,11052,11053],{},"Rectangle",[5261,11055,11056],{},"Triangle",". Кожна фігура має метод ",[5261,11059,11060],{},"double getArea() const",", що обчислює площу. Створіть масив покажчиків на ",[5261,11063,11046],{}," та обчисліть загальну площу всіх фігур у циклі.",[11039,11066,11068,11069,11072,11073,11076,11077,11080,11081,11084,11085,11088,11089,11092],{"icon":11041,"label":11067},"📋 Завдання 2: Поліморфний друк","Створіть базовий клас ",[5261,11070,11071],{},"Printer"," з віртуальним методом ",[5261,11074,11075],{},"void print(const std::string& text) const",". Реалізуйте похідні класи ",[5261,11078,11079],{},"ConsolePrinter"," (виводить на екран), ",[5261,11082,11083],{},"FilePrinter"," (записує у файл), ",[5261,11086,11087],{},"UpperCasePrinter"," (виводить великими літерами). Напишіть функцію ",[5261,11090,11091],{},"void sendDocument(const Printer& printer, const std::string& doc)",", що працює з будь-яким типом принтера.",[11039,11094,11097,11098,11100,11101,5805,11103,11105,11106,11109,11110,11113],{"icon":11095,"label":11096},"i-lucide-help-circle","❓ Чому виклик basePtr->method() викликає базовий метод без virtual?","Без ключового слова ",[5261,11099,5852],{}," C++ використовує ",[5742,11102,5804],{},[5807,11104,5809],{},"): вибір методу для виклику відбувається під час компіляції на основі типу покажчика (",[5261,11107,11108],{},"Base*","), а не реального типу об'єкта в пам'яті (",[5261,11111,11112],{},"Derived","). Це поведінка за замовчуванням заради продуктивності та сумісності з мовою C. Динамічне зв'язування (вибір методу під час виконання) активується лише для віртуальних функцій.",[11039,11115,11117,11118,11120,11121,11123,11124,7504,11126,11128,11129,11131],{"icon":11095,"label":11116},"❓ Чи потрібно писати virtual у похідних класах, якщо базовий метод віртуальний?","Технічно — ні. Якщо метод базового класу позначено як ",[5261,11119,5852],{},", всі його перевизначення автоматично стають віртуальними, навіть без явного ",[5261,11122,5852],{},". Проте ",[5742,11125,7503],{},[5261,11127,5852],{}," у похідних класах (або краще — специфікатора ",[5261,11130,5913],{}," у C++11 і новіших), адже це підвищує читабельність коду та чітко показує намір програміста.",[11039,11133,6584,11135,11138,11139,11141,11142,11144],{"icon":11095,"label":11134},"❓ Що станеться, якщо перевизначення відрізняється специфікатором const?",[5742,11136,11137],{},"не вважатиметься перевизначенням"," — це буде незалежна функція з іншою сигнатурою. Виклик через покажчик на базовий клас виконає базову реалізацію, а не похідну. Це типова пастка: програміст забуває ",[5261,11140,5433],{}," у перевизначенні, код компілюється без попереджень, але поліморфізм не працює. Тому в C++11 рекомендовано використовувати специфікатор ",[5261,11143,5913],{},", який змушує компілятор перевірити сигнатуру та видати помилку за невідповідності.",[5252,11146,11148],{"id":11147},"архітектура-динамічного-звязування-як-працює-поліморфізм-під-капотом","Архітектура динамічного зв'язування: як працює поліморфізм під капотом",[5929,11150,11152],{"id":11151},"концептуальна-модель-диспетчеризації-викликів","Концептуальна модель диспетчеризації викликів",[5257,11154,11155],{},"Щоб зрозуміти, як C++ вибирає правильний метод під час виконання віртуального виклику, розглянемо концептуальну модель роботи динамічного зв'язування. Коли компілятор зустрічає клас із віртуальними функціями, він автоматично генерує допоміжні структури даних, які забезпечують диспетчеризацію викликів у runtime.",[7165,11157,11159],{"alt":11158},"Диспетчеризація віртуального виклику через покажчик на базовий клас",[5285,11160,11162],{"className":7170,"code":11161,"language":7172,"meta":5291,"style":5291},"@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\n\npackage \"Ієрархія класів\" {\n    class Animal {\n        + virtual speak() : const char*\n        + getName() : string\n    }\n    \n    class Dog {\n        + speak() : const char*\n        + fetch() : void\n    }\n    \n    class Cat {\n        + speak() : const char*\n    }\n    \n    Animal \u003C|-- Dog\n    Animal \u003C|-- Cat\n}\n\npackage \"Виконавче середовище\" {\n    object \"barsik : Dog\" as obj {\n        name = \"Барсік\"\n    }\n    \n    object \"ptrAnimal : Animal*\" as ptr\n}\n\nptr -right-> obj : адресує об'єкт Dog\n\nnote bottom of ptr\n  Статичний тип: Animal*\n  Динамічний тип: Dog*\nend note\n\nnote right of obj #DBEAFE\n  При виклику ptrAnimal->speak()\n  виконавче середовище аналізує\n  реальний тип об'єкта (Dog)\n  і викликає Dog::speak()\nend note\n@enduml\n",[5261,11163,11164,11168,11172,11176,11180,11185,11190,11195,11200,11204,11208,11213,11218,11223,11227,11231,11236,11240,11244,11248,11253,11258,11262,11266,11271,11276,11281,11285,11289,11294,11298,11302,11307,11311,11316,11321,11326,11330,11334,11339,11344,11349,11354,11359,11363],{"__ignoreMap":5291},[5295,11165,11166],{"class":5297,"line":5298},[5295,11167,7179],{},[5295,11169,11170],{"class":5297,"line":5309},[5295,11171,7184],{},[5295,11173,11174],{"class":5297,"line":5317},[5295,11175,7189],{},[5295,11177,11178],{"class":5297,"line":5324},[5295,11179,5321],{"emptyLinePlaceholder":5320},[5295,11181,11182],{"class":5297,"line":5335},[5295,11183,11184],{},"package \"Ієрархія класів\" {\n",[5295,11186,11187],{"class":5297,"line":5342},[5295,11188,11189],{},"    class Animal {\n",[5295,11191,11192],{"class":5297,"line":5348},[5295,11193,11194],{},"        + virtual speak() : const char*\n",[5295,11196,11197],{"class":5297,"line":5367},[5295,11198,11199],{},"        + getName() : string\n",[5295,11201,11202],{"class":5297,"line":5372},[5295,11203,8546],{},[5295,11205,11206],{"class":5297,"line":5378},[5295,11207,5415],{},[5295,11209,11210],{"class":5297,"line":5412},[5295,11211,11212],{},"    class Dog {\n",[5295,11214,11215],{"class":5297,"line":5418},[5295,11216,11217],{},"        + speak() : const char*\n",[5295,11219,11220],{"class":5297,"line":5447},[5295,11221,11222],{},"        + fetch() : void\n",[5295,11224,11225],{"class":5297,"line":5472},[5295,11226,8546],{},[5295,11228,11229],{"class":5297,"line":5478},[5295,11230,5415],{},[5295,11232,11233],{"class":5297,"line":5483},[5295,11234,11235],{},"    class Cat {\n",[5295,11237,11238],{"class":5297,"line":5499},[5295,11239,11217],{},[5295,11241,11242],{"class":5297,"line":5504},[5295,11243,8546],{},[5295,11245,11246],{"class":5297,"line":5509},[5295,11247,5415],{},[5295,11249,11250],{"class":5297,"line":5535},[5295,11251,11252],{},"    Animal \u003C|-- Dog\n",[5295,11254,11255],{"class":5297,"line":5540},[5295,11256,11257],{},"    Animal \u003C|-- Cat\n",[5295,11259,11260],{"class":5297,"line":5562},[5295,11261,5655],{},[5295,11263,11264],{"class":5297,"line":5567},[5295,11265,5321],{"emptyLinePlaceholder":5320},[5295,11267,11268],{"class":5297,"line":5572},[5295,11269,11270],{},"package \"Виконавче середовище\" {\n",[5295,11272,11273],{"class":5297,"line":5597},[5295,11274,11275],{},"    object \"barsik : Dog\" as obj {\n",[5295,11277,11278],{"class":5297,"line":5602},[5295,11279,11280],{},"        name = \"Барсік\"\n",[5295,11282,11283],{"class":5297,"line":5652},[5295,11284,8546],{},[5295,11286,11287],{"class":5297,"line":5658},[5295,11288,5415],{},[5295,11290,11291],{"class":5297,"line":5663},[5295,11292,11293],{},"    object \"ptrAnimal : Animal*\" as ptr\n",[5295,11295,11296],{"class":5297,"line":5675},[5295,11297,5655],{},[5295,11299,11300],{"class":5297,"line":5680},[5295,11301,5321],{"emptyLinePlaceholder":5320},[5295,11303,11304],{"class":5297,"line":5696},[5295,11305,11306],{},"ptr -right-> obj : адресує об'єкт Dog\n",[5295,11308,11309],{"class":5297,"line":5714},[5295,11310,5321],{"emptyLinePlaceholder":5320},[5295,11312,11313],{"class":5297,"line":5719},[5295,11314,11315],{},"note bottom of ptr\n",[5295,11317,11318],{"class":5297,"line":5731},[5295,11319,11320],{},"  Статичний тип: Animal*\n",[5295,11322,11323],{"class":5297,"line":6354},[5295,11324,11325],{},"  Динамічний тип: Dog*\n",[5295,11327,11328],{"class":5297,"line":6387},[5295,11329,7247],{},[5295,11331,11332],{"class":5297,"line":6392},[5295,11333,5321],{"emptyLinePlaceholder":5320},[5295,11335,11336],{"class":5297,"line":6401},[5295,11337,11338],{},"note right of obj #DBEAFE\n",[5295,11340,11341],{"class":5297,"line":9032},[5295,11342,11343],{},"  При виклику ptrAnimal->speak()\n",[5295,11345,11346],{"class":5297,"line":9045},[5295,11347,11348],{},"  виконавче середовище аналізує\n",[5295,11350,11351],{"class":5297,"line":9059},[5295,11352,11353],{},"  реальний тип об'єкта (Dog)\n",[5295,11355,11356],{"class":5297,"line":9073},[5295,11357,11358],{},"  і викликає Dog::speak()\n",[5295,11360,11361],{"class":5297,"line":9078},[5295,11362,7247],{},[5295,11364,11365],{"class":5297,"line":9084},[5295,11366,7276],{},[5257,11368,11369,11370,11372],{},"Коли ми викликаємо ",[5261,11371,7098],{},", відбувається наступне:",[7285,11374,11375,11386,11396,11407],{},[5837,11376,11377,11380,11381,11383,11384],{},[5742,11378,11379],{},"Компілятор"," бачить, що ",[5261,11382,5275],{}," є віртуальним методом класу ",[5261,11385,5263],{},[5837,11387,11388,11389,11392,11393,11395],{},"Генерується код для ",[5742,11390,11391],{},"непрямого виклику",": замість прямого переходу за адресою ",[5261,11394,5795],{},", виконавче середовище перевіряє реальний тип об'єкта в пам'яті",[5837,11397,11398,11401,11402,11404,11405],{},[5742,11399,11400],{},"Runtime-система"," визначає, що ",[5261,11403,6336],{}," адресує об'єкт класу ",[5261,11406,5271],{},[5837,11408,11409,11410,11412,11413],{},"Викликається реалізація ",[5261,11411,5754],{}," замість ",[5261,11414,5795],{},[5257,11416,11417,11418,5805,11421,11423,11424,11427,11428,11430,11431,11434,11435,5824],{},"Це працює завдяки ",[5742,11419,11420],{},"віртуальній таблиці",[5807,11422,10871],{},") — механізму, який ми детально вивчимо в одній із наступних статей. На даному етапі важливо зрозуміти концептуальну різницю між ",[5742,11425,11426],{},"статичним типом"," покажчика (тип, оголошений у коді — ",[5261,11429,6467],{},") та ",[5742,11432,11433],{},"динамічним типом"," об'єкта (реальний тип об'єкта в пам'яті — ",[5261,11436,5271],{},[5929,11438,11440],{"id":11439},"статичний-тип-проти-динамічного-типу","Статичний тип проти динамічного типу",[5257,11442,11443,5805,11446,11449],{},[5742,11444,11445],{},"Статичний тип",[5807,11447,11448],{},"static type",") — це тип змінної, оголошений у коді. Він відомий компілятору під час компіляції і ніколи не змінюється:",[5285,11451,11453],{"className":5287,"code":11452,"language":5290,"meta":5291,"style":5291},"Animal* ptrAnimal = &barsik;  \u002F\u002F Статичний тип: Animal*\n",[5261,11454,11455],{"__ignoreMap":5291},[5295,11456,11457,11459,11461,11463,11465,11467,11469],{"class":5297,"line":5298},[5295,11458,5263],{"class":5360},[5295,11460,10189],{"class":5338},[5295,11462,6336],{"class":5360},[5295,11464,6247],{"class":5338},[5295,11466,5704],{"class":5360},[5295,11468,6252],{"class":5338},[5295,11470,11471],{"class":5710},"  \u002F\u002F Статичний тип: Animal*\n",[5257,11473,11474,5805,11477,11480],{},[5742,11475,11476],{},"Динамічний тип",[5807,11478,11479],{},"dynamic type",") — це реальний тип об'єкта, на який вказує покажчик під час виконання програми. Він може змінюватися протягом життя покажчика:",[5285,11482,11484],{"className":5287,"code":11483,"language":5290,"meta":5291,"style":5291},"Animal* ptrAnimal = &murka;   \u002F\u002F Динамічний тип: Cat*\nptrAnimal = &barsik;          \u002F\u002F Динамічний тип змінився: Dog*\n",[5261,11485,11486,11503],{"__ignoreMap":5291},[5295,11487,11488,11490,11492,11494,11496,11498,11500],{"class":5297,"line":5298},[5295,11489,5263],{"class":5360},[5295,11491,10189],{"class":5338},[5295,11493,6336],{"class":5360},[5295,11495,6247],{"class":5338},[5295,11497,6876],{"class":5360},[5295,11499,6252],{"class":5338},[5295,11501,11502],{"class":5710},"   \u002F\u002F Динамічний тип: Cat*\n",[5295,11504,11505,11507,11509,11511,11513],{"class":5297,"line":5309},[5295,11506,6336],{"class":5360},[5295,11508,6247],{"class":5338},[5295,11510,5704],{"class":5360},[5295,11512,6252],{"class":5338},[5295,11514,11515],{"class":5710},"          \u002F\u002F Динамічний тип змінився: Dog*\n",[5257,11517,11518,11519,11522,11523,11526],{},"Для ",[5742,11520,11521],{},"невіртуальних методів"," компілятор орієнтується на статичний тип — рішення приймається під час компіляції. Для ",[5742,11524,11525],{},"віртуальних методів"," виконавче середовище орієнтується на динамічний тип — рішення приймається під час виконання.",[11528,11529,11530,11719],"code-group",{},[5285,11531,11534],{"className":5287,"code":11532,"filename":11533,"language":5290,"meta":5291,"style":5291},"class Animal {\npublic:\n    void move() const { \n        std::cout \u003C\u003C \"Тварина рухається\\n\"; \n    }\n};\n\nclass Dog : public Animal {\npublic:\n    void move() const { \n        std::cout \u003C\u003C \"Собака біжить\\n\"; \n    }\n};\n\nint main() {\n    Dog barsik;\n    Animal* ptr = &barsik;\n    \n    \u002F\u002F Компілятор бачить статичний тип Animal*\n    \u002F\u002F Викликається Animal::move()\n    ptr->move();  \u002F\u002F Виведе: \"Тварина рухається\"\n}\n","Невіртуальний метод",[5261,11535,11536,11545,11549,11563,11583,11587,11591,11595,11609,11613,11625,11644,11648,11652,11656,11665,11673,11687,11691,11696,11701,11715],{"__ignoreMap":5291},[5295,11537,11538,11540,11542],{"class":5297,"line":5298},[5295,11539,5328],{"class":5327},[5295,11541,5585],{"class":5331},[5295,11543,11544],{"class":5338}," {\n",[5295,11546,11547],{"class":5297,"line":5309},[5295,11548,5375],{"class":5327},[5295,11550,11551,11553,11556,11558,11560],{"class":5297,"line":5317},[5295,11552,6170],{"class":5327},[5295,11554,11555],{"class":5381}," move",[5295,11557,5430],{"class":5338},[5295,11559,5433],{"class":5327},[5295,11561,11562],{"class":5338}," { \n",[5295,11564,11565,11567,11569,11571,11573,11576,11578,11580],{"class":5297,"line":5324},[5295,11566,8512],{"class":5331},[5295,11568,5354],{"class":5338},[5295,11570,5609],{"class":5360},[5295,11572,5612],{"class":5338},[5295,11574,11575],{"class":5305},"\"Тварина рухається",[5295,11577,5645],{"class":5644},[5295,11579,5641],{"class":5305},[5295,11581,11582],{"class":5338},"; \n",[5295,11584,11585],{"class":5297,"line":5335},[5295,11586,8546],{"class":5338},[5295,11588,11589],{"class":5297,"line":5342},[5295,11590,5475],{"class":5338},[5295,11592,11593],{"class":5297,"line":5348},[5295,11594,5321],{"emptyLinePlaceholder":5320},[5295,11596,11597,11599,11601,11603,11605,11607],{"class":5297,"line":5367},[5295,11598,5328],{"class":5327},[5295,11600,5488],{"class":5331},[5295,11602,5491],{"class":5338},[5295,11604,5494],{"class":5327},[5295,11606,5585],{"class":5331},[5295,11608,11544],{"class":5338},[5295,11610,11611],{"class":5297,"line":5372},[5295,11612,5375],{"class":5327},[5295,11614,11615,11617,11619,11621,11623],{"class":5297,"line":5378},[5295,11616,6170],{"class":5327},[5295,11618,11555],{"class":5381},[5295,11620,5430],{"class":5338},[5295,11622,5433],{"class":5327},[5295,11624,11562],{"class":5338},[5295,11626,11627,11629,11631,11633,11635,11638,11640,11642],{"class":5297,"line":5412},[5295,11628,8512],{"class":5331},[5295,11630,5354],{"class":5338},[5295,11632,5609],{"class":5360},[5295,11634,5612],{"class":5338},[5295,11636,11637],{"class":5305},"\"Собака біжить",[5295,11639,5645],{"class":5644},[5295,11641,5641],{"class":5305},[5295,11643,11582],{"class":5338},[5295,11645,11646],{"class":5297,"line":5418},[5295,11647,8546],{"class":5338},[5295,11649,11650],{"class":5297,"line":5447},[5295,11651,5475],{"class":5338},[5295,11653,11654],{"class":5297,"line":5472},[5295,11655,5321],{"emptyLinePlaceholder":5320},[5295,11657,11658,11660,11662],{"class":5297,"line":5478},[5295,11659,5666],{"class":5327},[5295,11661,5669],{"class":5381},[5295,11663,11664],{"class":5338},"() {\n",[5295,11666,11667,11669,11671],{"class":5297,"line":5483},[5295,11668,5512],{"class":5331},[5295,11670,5685],{"class":5360},[5295,11672,5364],{"class":5338},[5295,11674,11675,11677,11679,11681,11683,11685],{"class":5297,"line":5499},[5295,11676,5382],{"class":5331},[5295,11678,6241],{"class":5327},[5295,11680,9792],{"class":5360},[5295,11682,6247],{"class":5338},[5295,11684,5704],{"class":5360},[5295,11686,5364],{"class":5338},[5295,11688,11689],{"class":5297,"line":5504},[5295,11690,5415],{"class":5338},[5295,11692,11693],{"class":5297,"line":5509},[5295,11694,11695],{"class":5710},"    \u002F\u002F Компілятор бачить статичний тип Animal*\n",[5295,11697,11698],{"class":5297,"line":5535},[5295,11699,11700],{"class":5710},"    \u002F\u002F Викликається Animal::move()\n",[5295,11702,11703,11705,11707,11710,11712],{"class":5297,"line":5540},[5295,11704,9807],{"class":5360},[5295,11706,6339],{"class":5338},[5295,11708,11709],{"class":5381},"move",[5295,11711,6534],{"class":5338},[5295,11713,11714],{"class":5710},"  \u002F\u002F Виведе: \"Тварина рухається\"\n",[5295,11716,11717],{"class":5297,"line":5562},[5295,11718,5655],{"class":5338},[5285,11720,11723],{"className":5287,"code":11721,"filename":11722,"language":5290,"meta":5291,"style":5291},"class Animal {\npublic:\n    virtual void move() const { \n        std::cout \u003C\u003C \"Тварина рухається\\n\"; \n    }\n};\n\nclass Dog : public Animal {\npublic:\n    void move() const { \n        std::cout \u003C\u003C \"Собака біжить\\n\"; \n    }\n};\n\nint main() {\n    Dog barsik;\n    Animal* ptr = &barsik;\n    \n    \u002F\u002F Runtime аналізує динамічний тип Dog*\n    \u002F\u002F Викликається Dog::move()\n    ptr->move();  \u002F\u002F Виведе: \"Собака біжить\"\n}\n","Віртуальний метод",[5261,11724,11725,11733,11737,11751,11769,11773,11777,11781,11795,11799,11811,11829,11833,11837,11841,11849,11857,11871,11875,11880,11885,11898],{"__ignoreMap":5291},[5295,11726,11727,11729,11731],{"class":5297,"line":5298},[5295,11728,5328],{"class":5327},[5295,11730,5585],{"class":5331},[5295,11732,11544],{"class":5338},[5295,11734,11735],{"class":5297,"line":5309},[5295,11736,5375],{"class":5327},[5295,11738,11739,11741,11743,11745,11747,11749],{"class":5297,"line":5317},[5295,11740,7354],{"class":5327},[5295,11742,9666],{"class":5327},[5295,11744,11555],{"class":5381},[5295,11746,5430],{"class":5338},[5295,11748,5433],{"class":5327},[5295,11750,11562],{"class":5338},[5295,11752,11753,11755,11757,11759,11761,11763,11765,11767],{"class":5297,"line":5324},[5295,11754,8512],{"class":5331},[5295,11756,5354],{"class":5338},[5295,11758,5609],{"class":5360},[5295,11760,5612],{"class":5338},[5295,11762,11575],{"class":5305},[5295,11764,5645],{"class":5644},[5295,11766,5641],{"class":5305},[5295,11768,11582],{"class":5338},[5295,11770,11771],{"class":5297,"line":5335},[5295,11772,8546],{"class":5338},[5295,11774,11775],{"class":5297,"line":5342},[5295,11776,5475],{"class":5338},[5295,11778,11779],{"class":5297,"line":5348},[5295,11780,5321],{"emptyLinePlaceholder":5320},[5295,11782,11783,11785,11787,11789,11791,11793],{"class":5297,"line":5367},[5295,11784,5328],{"class":5327},[5295,11786,5488],{"class":5331},[5295,11788,5491],{"class":5338},[5295,11790,5494],{"class":5327},[5295,11792,5585],{"class":5331},[5295,11794,11544],{"class":5338},[5295,11796,11797],{"class":5297,"line":5372},[5295,11798,5375],{"class":5327},[5295,11800,11801,11803,11805,11807,11809],{"class":5297,"line":5378},[5295,11802,6170],{"class":5327},[5295,11804,11555],{"class":5381},[5295,11806,5430],{"class":5338},[5295,11808,5433],{"class":5327},[5295,11810,11562],{"class":5338},[5295,11812,11813,11815,11817,11819,11821,11823,11825,11827],{"class":5297,"line":5412},[5295,11814,8512],{"class":5331},[5295,11816,5354],{"class":5338},[5295,11818,5609],{"class":5360},[5295,11820,5612],{"class":5338},[5295,11822,11637],{"class":5305},[5295,11824,5645],{"class":5644},[5295,11826,5641],{"class":5305},[5295,11828,11582],{"class":5338},[5295,11830,11831],{"class":5297,"line":5418},[5295,11832,8546],{"class":5338},[5295,11834,11835],{"class":5297,"line":5447},[5295,11836,5475],{"class":5338},[5295,11838,11839],{"class":5297,"line":5472},[5295,11840,5321],{"emptyLinePlaceholder":5320},[5295,11842,11843,11845,11847],{"class":5297,"line":5478},[5295,11844,5666],{"class":5327},[5295,11846,5669],{"class":5381},[5295,11848,11664],{"class":5338},[5295,11850,11851,11853,11855],{"class":5297,"line":5483},[5295,11852,5512],{"class":5331},[5295,11854,5685],{"class":5360},[5295,11856,5364],{"class":5338},[5295,11858,11859,11861,11863,11865,11867,11869],{"class":5297,"line":5499},[5295,11860,5382],{"class":5331},[5295,11862,6241],{"class":5327},[5295,11864,9792],{"class":5360},[5295,11866,6247],{"class":5338},[5295,11868,5704],{"class":5360},[5295,11870,5364],{"class":5338},[5295,11872,11873],{"class":5297,"line":5504},[5295,11874,5415],{"class":5338},[5295,11876,11877],{"class":5297,"line":5509},[5295,11878,11879],{"class":5710},"    \u002F\u002F Runtime аналізує динамічний тип Dog*\n",[5295,11881,11882],{"class":5297,"line":5535},[5295,11883,11884],{"class":5710},"    \u002F\u002F Викликається Dog::move()\n",[5295,11886,11887,11889,11891,11893,11895],{"class":5297,"line":5540},[5295,11888,9807],{"class":5360},[5295,11890,6339],{"class":5338},[5295,11892,11709],{"class":5381},[5295,11894,6534],{"class":5338},[5295,11896,11897],{"class":5710},"  \u002F\u002F Виведе: \"Собака біжить\"\n",[5295,11899,11900],{"class":5297,"line":5562},[5295,11901,5655],{"class":5338},[5252,11903,11905],{"id":11904},"складніший-приклад-багаторівнева-ієрархія","Складніший приклад: багаторівнева ієрархія",[5929,11907,11909],{"id":11908},"пошук-найпохіднішого-методу","Пошук найпохіднішого методу",[5257,11911,11912,11913,11916,11917,11920,11921,10169],{},"У реальних системах ієрархії класів часто мають більше двох рівнів. Розглянемо багаторівневу ієрархію, де клас ",[5261,11914,11915],{},"C"," успадковує ",[5261,11918,11919],{},"B",", який у свою чергу успадковує ",[5261,11922,11923],{},"A",[5285,11925,11928],{"className":5287,"code":11926,"filename":11927,"language":5290,"meta":5291,"style":5291},"#include \u003Ciostream>\n\nclass A\n{\npublic:\n    virtual const char* getName() const { return \"A\"; }\n};\n\nclass B : public A\n{\npublic:\n    virtual const char* getName() const { return \"B\"; }\n};\n\nclass C : public B\n{\npublic:\n    \u002F\u002F Клас C не перевизначає getName()\n};\n\nclass D : public C\n{\npublic:\n    virtual const char* getName() const { return \"D\"; }\n};\n\nint main()\n{\n    C objC;\n    A& refA = objC;  \u002F\u002F Посилання типу A& на об'єкт класу C\n    \n    std::cout \u003C\u003C \"refA.getName() = \" \u003C\u003C refA.getName() \u003C\u003C \"\\n\";\n    \n    return 0;\n}\n","MultiLevelHierarchy.cpp",[5261,11929,11930,11936,11940,11947,11951,11955,11978,11982,11986,11999,12003,12007,12030,12034,12038,12052,12056,12060,12065,12069,12073,12087,12091,12095,12118,12122,12126,12134,12138,12148,12168,12172,12204,12208,12216],{"__ignoreMap":5291},[5295,11931,11932,11934],{"class":5297,"line":5298},[5295,11933,5302],{"class":5301},[5295,11935,5306],{"class":5305},[5295,11937,11938],{"class":5297,"line":5309},[5295,11939,5321],{"emptyLinePlaceholder":5320},[5295,11941,11942,11944],{"class":5297,"line":5317},[5295,11943,5328],{"class":5327},[5295,11945,11946],{"class":5331}," A\n",[5295,11948,11949],{"class":5297,"line":5324},[5295,11950,5339],{"class":5338},[5295,11952,11953],{"class":5297,"line":5335},[5295,11954,5375],{"class":5327},[5295,11956,11957,11959,11961,11963,11965,11967,11969,11971,11973,11976],{"class":5297,"line":5342},[5295,11958,7354],{"class":5327},[5295,11960,7357],{"class":5327},[5295,11962,5453],{"class":5327},[5295,11964,5427],{"class":5381},[5295,11966,5430],{"class":5338},[5295,11968,5433],{"class":5327},[5295,11970,5436],{"class":5338},[5295,11972,5439],{"class":5301},[5295,11974,11975],{"class":5305}," \"A\"",[5295,11977,5444],{"class":5338},[5295,11979,11980],{"class":5297,"line":5348},[5295,11981,5475],{"class":5338},[5295,11983,11984],{"class":5297,"line":5367},[5295,11985,5321],{"emptyLinePlaceholder":5320},[5295,11987,11988,11990,11993,11995,11997],{"class":5297,"line":5372},[5295,11989,5328],{"class":5327},[5295,11991,11992],{"class":5331}," B",[5295,11994,5491],{"class":5338},[5295,11996,5494],{"class":5327},[5295,11998,11946],{"class":5331},[5295,12000,12001],{"class":5297,"line":5378},[5295,12002,5339],{"class":5338},[5295,12004,12005],{"class":5297,"line":5412},[5295,12006,5375],{"class":5327},[5295,12008,12009,12011,12013,12015,12017,12019,12021,12023,12025,12028],{"class":5297,"line":5418},[5295,12010,7354],{"class":5327},[5295,12012,7357],{"class":5327},[5295,12014,5453],{"class":5327},[5295,12016,5427],{"class":5381},[5295,12018,5430],{"class":5338},[5295,12020,5433],{"class":5327},[5295,12022,5436],{"class":5338},[5295,12024,5439],{"class":5301},[5295,12026,12027],{"class":5305}," \"B\"",[5295,12029,5444],{"class":5338},[5295,12031,12032],{"class":5297,"line":5447},[5295,12033,5475],{"class":5338},[5295,12035,12036],{"class":5297,"line":5472},[5295,12037,5321],{"emptyLinePlaceholder":5320},[5295,12039,12040,12042,12045,12047,12049],{"class":5297,"line":5478},[5295,12041,5328],{"class":5327},[5295,12043,12044],{"class":5331}," C",[5295,12046,5491],{"class":5338},[5295,12048,5494],{"class":5327},[5295,12050,12051],{"class":5331}," B\n",[5295,12053,12054],{"class":5297,"line":5483},[5295,12055,5339],{"class":5338},[5295,12057,12058],{"class":5297,"line":5499},[5295,12059,5375],{"class":5327},[5295,12061,12062],{"class":5297,"line":5504},[5295,12063,12064],{"class":5710},"    \u002F\u002F Клас C не перевизначає getName()\n",[5295,12066,12067],{"class":5297,"line":5509},[5295,12068,5475],{"class":5338},[5295,12070,12071],{"class":5297,"line":5535},[5295,12072,5321],{"emptyLinePlaceholder":5320},[5295,12074,12075,12077,12080,12082,12084],{"class":5297,"line":5540},[5295,12076,5328],{"class":5327},[5295,12078,12079],{"class":5331}," D",[5295,12081,5491],{"class":5338},[5295,12083,5494],{"class":5327},[5295,12085,12086],{"class":5331}," C\n",[5295,12088,12089],{"class":5297,"line":5562},[5295,12090,5339],{"class":5338},[5295,12092,12093],{"class":5297,"line":5567},[5295,12094,5375],{"class":5327},[5295,12096,12097,12099,12101,12103,12105,12107,12109,12111,12113,12116],{"class":5297,"line":5572},[5295,12098,7354],{"class":5327},[5295,12100,7357],{"class":5327},[5295,12102,5453],{"class":5327},[5295,12104,5427],{"class":5381},[5295,12106,5430],{"class":5338},[5295,12108,5433],{"class":5327},[5295,12110,5436],{"class":5338},[5295,12112,5439],{"class":5301},[5295,12114,12115],{"class":5305}," \"D\"",[5295,12117,5444],{"class":5338},[5295,12119,12120],{"class":5297,"line":5597},[5295,12121,5475],{"class":5338},[5295,12123,12124],{"class":5297,"line":5602},[5295,12125,5321],{"emptyLinePlaceholder":5320},[5295,12127,12128,12130,12132],{"class":5297,"line":5652},[5295,12129,5666],{"class":5327},[5295,12131,5669],{"class":5381},[5295,12133,5672],{"class":5338},[5295,12135,12136],{"class":5297,"line":5658},[5295,12137,5339],{"class":5338},[5295,12139,12140,12143,12146],{"class":5297,"line":5663},[5295,12141,12142],{"class":5331},"    C",[5295,12144,12145],{"class":5360}," objC",[5295,12147,5364],{"class":5338},[5295,12149,12150,12153,12155,12158,12160,12163,12165],{"class":5297,"line":5675},[5295,12151,12152],{"class":5331},"    A",[5295,12154,5588],{"class":5327},[5295,12156,12157],{"class":5360}," refA",[5295,12159,6276],{"class":5338},[5295,12161,12162],{"class":5360},"objC",[5295,12164,6252],{"class":5338},[5295,12166,12167],{"class":5710},"  \u002F\u002F Посилання типу A& на об'єкт класу C\n",[5295,12169,12170],{"class":5297,"line":5680},[5295,12171,5415],{"class":5338},[5295,12173,12174,12176,12178,12180,12182,12185,12187,12190,12192,12194,12196,12198,12200,12202],{"class":5297,"line":5696},[5295,12175,5351],{"class":5331},[5295,12177,5354],{"class":5338},[5295,12179,5609],{"class":5360},[5295,12181,5612],{"class":5338},[5295,12183,12184],{"class":5305},"\"refA.getName() = \"",[5295,12186,5612],{"class":5338},[5295,12188,12189],{"class":5360},"refA",[5295,12191,5618],{"class":5338},[5295,12193,5621],{"class":5381},[5295,12195,5624],{"class":5338},[5295,12197,5641],{"class":5305},[5295,12199,5645],{"class":5644},[5295,12201,5641],{"class":5305},[5295,12203,5364],{"class":5338},[5295,12205,12206],{"class":5297,"line":5714},[5295,12207,5415],{"class":5338},[5295,12209,12210,12212,12214],{"class":5297,"line":5719},[5295,12211,5722],{"class":5301},[5295,12213,5726],{"class":5725},[5295,12215,5364],{"class":5338},[5295,12217,12218],{"class":5297,"line":5731},[5295,12219,5655],{"class":5338},[5257,12221,12222],{},"Який результат виведе ця програма? Проаналізуймо крок за кроком:",[7285,12224,12225,12232,12242,12249,12263,12273,12281],{},[5837,12226,12227,12228,7480,12230],{},"Створюється об'єкт ",[5261,12229,12162],{},[5261,12231,11915],{},[5837,12233,12234,12235,12237,12238,12241],{},"Посилання ",[5261,12236,12189],{}," типу ",[5261,12239,12240],{},"A&"," адресує цей об'єкт",[5837,12243,12244,12245,12248],{},"Викликається ",[5261,12246,12247],{},"refA.getName()"," — це віртуальний метод",[5837,12250,12251,12252,12255,12256,5268,12258,12260,12261,10786],{},"Runtime шукає ",[5742,12253,12254],{},"найпохідніший метод"," між класами ",[5261,12257,11923],{},[5261,12259,11915],{}," (динамічний тип об'єкта — ",[5261,12262,11915],{},[5837,12264,12265,12266,12268,12269,12272],{},"Клас ",[5261,12267,11915],{}," не має власної реалізації ",[5261,12270,12271],{},"getName()",", тому пошук продовжується вверх по ієрархії",[5837,12274,12265,12275,12277,12278,12280],{},[5261,12276,11919],{}," має метод ",[5261,12279,12271],{}," — це найпохідніша реалізація",[5837,12282,12244,12283],{},[5261,12284,12285],{},"B::getName()",[5761,12287,12289],{"title":12288},".\u002FMultiLevelHierarchy",[5765,12290,12292],{"className":12291},[5297],"refA.getName() = B",[5257,12294,12295,12296,12299,12300,7913,12302,5268,12304,12306,12307,12310,12311,10764,12313,5618],{},"Важливо: динамічне зв'язування розглядає ",[5742,12297,12298],{},"тільки ті класи, які знаходяться між статичним типом покажчика та динамічним типом об'єкта",". У нашому випадку це класи ",[5261,12301,11923],{},[5261,12303,11919],{},[5261,12305,11915],{},". Клас ",[5261,12308,12309],{},"D"," не розглядається, адже об'єкт має тип ",[5261,12312,11915],{},[5261,12314,12309],{},[6448,12316,12317,12320],{},[5742,12318,12319],{},"Алгоритм пошуку віртуального методу",": коли викликається віртуальна функція через покажчик або посилання, виконавче середовище починає пошук з динамічного типу об'єкта і рухається вгору по ієрархії до статичного типу покажчика, шукаючи першу (найпохіднішу) реалізацію методу. Якщо жоден похідний клас не перевизначив метод, викликається реалізація базового класу.",[5929,12322,12324],{"id":12323},"ієрархія-з-пропущеним-перевизначенням","Ієрархія з пропущеним перевизначенням",[5257,12326,12327],{},"Розглянемо ситуацію, коли проміжний клас у ланцюгу не перевизначає віртуальний метод:",[5285,12329,12332],{"className":5287,"code":12330,"filename":12331,"language":5290,"meta":5291,"style":5291},"#include \u003Ciostream>\n\nclass A\n{\npublic:\n    virtual const char* getName() const { return \"A\"; }\n};\n\nclass B : public A\n{\npublic:\n    \u002F\u002F B не перевизначає getName()\n};\n\nclass C : public B\n{\npublic:\n    virtual const char* getName() const { return \"C\"; }\n};\n\nint main()\n{\n    C objC;\n    \n    B& refB = objC;  \u002F\u002F Посилання типу B& на об'єкт класу C\n    std::cout \u003C\u003C \"refB.getName() = \" \u003C\u003C refB.getName() \u003C\u003C \"\\n\";\n    \n    A& refA = objC;  \u002F\u002F Посилання типу A& на той самий об'єкт\n    std::cout \u003C\u003C \"refA.getName() = \" \u003C\u003C refA.getName() \u003C\u003C \"\\n\";\n    \n    return 0;\n}\n","SkippedOverride.cpp",[5261,12333,12334,12340,12344,12350,12354,12358,12380,12384,12388,12400,12404,12408,12413,12417,12421,12433,12437,12441,12464,12468,12472,12480,12484,12492,12496,12515,12547,12551,12568,12598,12602,12610],{"__ignoreMap":5291},[5295,12335,12336,12338],{"class":5297,"line":5298},[5295,12337,5302],{"class":5301},[5295,12339,5306],{"class":5305},[5295,12341,12342],{"class":5297,"line":5309},[5295,12343,5321],{"emptyLinePlaceholder":5320},[5295,12345,12346,12348],{"class":5297,"line":5317},[5295,12347,5328],{"class":5327},[5295,12349,11946],{"class":5331},[5295,12351,12352],{"class":5297,"line":5324},[5295,12353,5339],{"class":5338},[5295,12355,12356],{"class":5297,"line":5335},[5295,12357,5375],{"class":5327},[5295,12359,12360,12362,12364,12366,12368,12370,12372,12374,12376,12378],{"class":5297,"line":5342},[5295,12361,7354],{"class":5327},[5295,12363,7357],{"class":5327},[5295,12365,5453],{"class":5327},[5295,12367,5427],{"class":5381},[5295,12369,5430],{"class":5338},[5295,12371,5433],{"class":5327},[5295,12373,5436],{"class":5338},[5295,12375,5439],{"class":5301},[5295,12377,11975],{"class":5305},[5295,12379,5444],{"class":5338},[5295,12381,12382],{"class":5297,"line":5348},[5295,12383,5475],{"class":5338},[5295,12385,12386],{"class":5297,"line":5367},[5295,12387,5321],{"emptyLinePlaceholder":5320},[5295,12389,12390,12392,12394,12396,12398],{"class":5297,"line":5372},[5295,12391,5328],{"class":5327},[5295,12393,11992],{"class":5331},[5295,12395,5491],{"class":5338},[5295,12397,5494],{"class":5327},[5295,12399,11946],{"class":5331},[5295,12401,12402],{"class":5297,"line":5378},[5295,12403,5339],{"class":5338},[5295,12405,12406],{"class":5297,"line":5412},[5295,12407,5375],{"class":5327},[5295,12409,12410],{"class":5297,"line":5418},[5295,12411,12412],{"class":5710},"    \u002F\u002F B не перевизначає getName()\n",[5295,12414,12415],{"class":5297,"line":5447},[5295,12416,5475],{"class":5338},[5295,12418,12419],{"class":5297,"line":5472},[5295,12420,5321],{"emptyLinePlaceholder":5320},[5295,12422,12423,12425,12427,12429,12431],{"class":5297,"line":5478},[5295,12424,5328],{"class":5327},[5295,12426,12044],{"class":5331},[5295,12428,5491],{"class":5338},[5295,12430,5494],{"class":5327},[5295,12432,12051],{"class":5331},[5295,12434,12435],{"class":5297,"line":5483},[5295,12436,5339],{"class":5338},[5295,12438,12439],{"class":5297,"line":5499},[5295,12440,5375],{"class":5327},[5295,12442,12443,12445,12447,12449,12451,12453,12455,12457,12459,12462],{"class":5297,"line":5504},[5295,12444,7354],{"class":5327},[5295,12446,7357],{"class":5327},[5295,12448,5453],{"class":5327},[5295,12450,5427],{"class":5381},[5295,12452,5430],{"class":5338},[5295,12454,5433],{"class":5327},[5295,12456,5436],{"class":5338},[5295,12458,5439],{"class":5301},[5295,12460,12461],{"class":5305}," \"C\"",[5295,12463,5444],{"class":5338},[5295,12465,12466],{"class":5297,"line":5509},[5295,12467,5475],{"class":5338},[5295,12469,12470],{"class":5297,"line":5535},[5295,12471,5321],{"emptyLinePlaceholder":5320},[5295,12473,12474,12476,12478],{"class":5297,"line":5540},[5295,12475,5666],{"class":5327},[5295,12477,5669],{"class":5381},[5295,12479,5672],{"class":5338},[5295,12481,12482],{"class":5297,"line":5562},[5295,12483,5339],{"class":5338},[5295,12485,12486,12488,12490],{"class":5297,"line":5567},[5295,12487,12142],{"class":5331},[5295,12489,12145],{"class":5360},[5295,12491,5364],{"class":5338},[5295,12493,12494],{"class":5297,"line":5572},[5295,12495,5415],{"class":5338},[5295,12497,12498,12501,12503,12506,12508,12510,12512],{"class":5297,"line":5597},[5295,12499,12500],{"class":5331},"    B",[5295,12502,5588],{"class":5327},[5295,12504,12505],{"class":5360}," refB",[5295,12507,6276],{"class":5338},[5295,12509,12162],{"class":5360},[5295,12511,6252],{"class":5338},[5295,12513,12514],{"class":5710},"  \u002F\u002F Посилання типу B& на об'єкт класу C\n",[5295,12516,12517,12519,12521,12523,12525,12528,12530,12533,12535,12537,12539,12541,12543,12545],{"class":5297,"line":5602},[5295,12518,5351],{"class":5331},[5295,12520,5354],{"class":5338},[5295,12522,5609],{"class":5360},[5295,12524,5612],{"class":5338},[5295,12526,12527],{"class":5305},"\"refB.getName() = \"",[5295,12529,5612],{"class":5338},[5295,12531,12532],{"class":5360},"refB",[5295,12534,5618],{"class":5338},[5295,12536,5621],{"class":5381},[5295,12538,5624],{"class":5338},[5295,12540,5641],{"class":5305},[5295,12542,5645],{"class":5644},[5295,12544,5641],{"class":5305},[5295,12546,5364],{"class":5338},[5295,12548,12549],{"class":5297,"line":5652},[5295,12550,5415],{"class":5338},[5295,12552,12553,12555,12557,12559,12561,12563,12565],{"class":5297,"line":5658},[5295,12554,12152],{"class":5331},[5295,12556,5588],{"class":5327},[5295,12558,12157],{"class":5360},[5295,12560,6276],{"class":5338},[5295,12562,12162],{"class":5360},[5295,12564,6252],{"class":5338},[5295,12566,12567],{"class":5710},"  \u002F\u002F Посилання типу A& на той самий об'єкт\n",[5295,12569,12570,12572,12574,12576,12578,12580,12582,12584,12586,12588,12590,12592,12594,12596],{"class":5297,"line":5663},[5295,12571,5351],{"class":5331},[5295,12573,5354],{"class":5338},[5295,12575,5609],{"class":5360},[5295,12577,5612],{"class":5338},[5295,12579,12184],{"class":5305},[5295,12581,5612],{"class":5338},[5295,12583,12189],{"class":5360},[5295,12585,5618],{"class":5338},[5295,12587,5621],{"class":5381},[5295,12589,5624],{"class":5338},[5295,12591,5641],{"class":5305},[5295,12593,5645],{"class":5644},[5295,12595,5641],{"class":5305},[5295,12597,5364],{"class":5338},[5295,12599,12600],{"class":5297,"line":5675},[5295,12601,5415],{"class":5338},[5295,12603,12604,12606,12608],{"class":5297,"line":5680},[5295,12605,5722],{"class":5301},[5295,12607,5726],{"class":5725},[5295,12609,5364],{"class":5338},[5295,12611,12612],{"class":5297,"line":5696},[5295,12613,5655],{"class":5338},[5761,12615,12617,12621],{"title":12616},".\u002FSkippedOverride",[5765,12618,12620],{"className":12619},[5297],"refB.getName() = C",[5765,12622,12624],{"className":12623},[5297],"refA.getName() = C",[5257,12626,12627,12628,12631,12632,12634,12635,12637,12638,12640,12641,5618],{},"Обидва виклики виконують ",[5261,12629,12630],{},"C::getName()",", адже це найпохідніша реалізація в ієрархії об'єкта ",[5261,12633,12162],{},". Той факт, що клас ",[5261,12636,11919],{}," не має власної реалізації, не впливає на динамічне зв'язування — пошук просто пропускає клас ",[5261,12639,11919],{}," і знаходить ",[5261,12642,12630],{},[5252,12644,12646],{"id":12645},"практичний-приклад-система-обробки-подій","Практичний приклад: система обробки подій",[5929,12648,12650],{"id":12649},"моделювання-обробників-подій-інтерфейсу","Моделювання обробників подій інтерфейсу",[5257,12652,12653],{},"Розглянемо реалістичний приклад: система обробки подій користувацького інтерфейсу. У графічних додатках різні віджети (кнопки, текстові поля, слайдери) реагують на події миші та клавіатури по-різному. Поліморфізм дозволяє обробляти всі віджети через єдиний інтерфейс:",[5285,12655,12658],{"className":5287,"code":12656,"filename":12657,"language":5290,"meta":5291,"style":5291},"#include \u003Ciostream>\n#include \u003Cvector>\n\nclass Widget\n{\nprotected:\n    int x, y;\n    int width, height;\n\npublic:\n    Widget(int posX, int posY, int w, int h)\n        : x(posX), y(posY), width(w), height(h) {}\n    \n    virtual ~Widget() {}\n    \n    virtual void onClick()\n    {\n        std::cout \u003C\u003C \"Widget: базова обробка кліку\\n\";\n    }\n    \n    virtual void onKeyPress(char key)\n    {\n        std::cout \u003C\u003C \"Widget: базова обробка клавіші \" \u003C\u003C key \u003C\u003C \"\\n\";\n    }\n    \n    virtual void render() const\n    {\n        std::cout \u003C\u003C \"Widget: рендеринг базового віджета\\n\";\n    }\n};\n\nclass Button : public Widget\n{\nprivate:\n    std::string label;\n\npublic:\n    Button(int x, int y, int w, int h, std::string lbl)\n        : Widget(x, y, w, h), label(lbl) {}\n    \n    void onClick() override\n    {\n        std::cout \u003C\u003C \"Button [\" \u003C\u003C label \u003C\u003C \"]: виконання дії кнопки\\n\";\n    }\n    \n    void render() const override\n    {\n        std::cout \u003C\u003C \"Button: малюю кнопку з текстом '\" \u003C\u003C label \u003C\u003C \"'\\n\";\n    }\n};\n\nclass TextField : public Widget\n{\nprivate:\n    std::string content;\n\npublic:\n    TextField(int x, int y, int w, int h)\n        : Widget(x, y, w, h), content(\"\") {}\n    \n    void onClick() override\n    {\n        std::cout \u003C\u003C \"TextField: встановлення фокусу вводу\\n\";\n    }\n    \n    void onKeyPress(char key) override\n    {\n        content += key;\n        std::cout \u003C\u003C \"TextField: додано символ '\" \u003C\u003C key \n                  \u003C\u003C \"', вміст: \" \u003C\u003C content \u003C\u003C \"\\n\";\n    }\n    \n    void render() const override\n    {\n        std::cout \u003C\u003C \"TextField: малюю текстове поле з вмістом '\" \n                  \u003C\u003C content \u003C\u003C \"'\\n\";\n    }\n};\n\nclass Slider : public Widget\n{\nprivate:\n    int value;\n    int minValue, maxValue;\n\npublic:\n    Slider(int x, int y, int w, int h, int min, int max)\n        : Widget(x, y, w, h), value(min), minValue(min), maxValue(max) {}\n    \n    void onClick() override\n    {\n        value = (value + 10 \u003C= maxValue) ? value + 10 : maxValue;\n        std::cout \u003C\u003C \"Slider: нове значення \" \u003C\u003C value \u003C\u003C \"\\n\";\n    }\n    \n    void render() const override\n    {\n        std::cout \u003C\u003C \"Slider: малюю слайдер зі значенням \" \u003C\u003C value \u003C\u003C \"\\n\";\n    }\n};\n\nint main()\n{\n    \u002F\u002F Створюємо різні віджети\n    Button btnSubmit(10, 10, 100, 30, \"Submit\");\n    TextField inputName(10, 50, 200, 30);\n    Slider volumeControl(10, 90, 150, 20, 0, 100);\n    \n    \u002F\u002F Поліморфна колекція: масив покажчиків на базовий клас Widget\n    std::vector\u003CWidget*> widgets = { &btnSubmit, &inputName, &volumeControl };\n    \n    std::cout \u003C\u003C \"=== Рендеринг усіх віджетів ===\\n\";\n    for (Widget* w : widgets) {\n        w->render();\n    }\n    \n    std::cout \u003C\u003C \"\\n=== Симуляція кліків ===\\n\";\n    for (Widget* w : widgets) {\n        w->onClick();\n    }\n    \n    std::cout \u003C\u003C \"\\n=== Симуляція введення у TextField ===\\n\";\n    inputName.onKeyPress('H');\n    inputName.onKeyPress('i');\n    \n    return 0;\n}\n","EventHandling.cpp",[5261,12659,12660,12666,12673,12677,12684,12688,12692,12707,12721,12725,12729,12764,12807,12811,12821,12825,12836,12840,12859,12863,12867,12886,12890,12918,12922,12926,12939,12943,12962,12966,12970,12974,12987,12991,12996,13009,13013,13017,13060,13095,13099,13110,13114,13142,13146,13150,13162,13166,13194,13198,13202,13206,13219,13223,13227,13241,13246,13251,13283,13318,13323,13334,13339,13359,13364,13369,13387,13392,13405,13426,13448,13453,13458,13471,13476,13492,13509,13514,13519,13524,13538,13543,13548,13558,13573,13578,13583,13629,13682,13687,13698,13703,13740,13768,13773,13778,13791,13796,13824,13829,13834,13839,13848,13853,13859,13892,13920,13957,13962,13968,14006,14011,14031,14051,14065,14070,14075,14099,14118,14130,14135,14140,14164,14182,14198,14203,14212],{"__ignoreMap":5291},[5295,12661,12662,12664],{"class":5297,"line":5298},[5295,12663,5302],{"class":5301},[5295,12665,5306],{"class":5305},[5295,12667,12668,12670],{"class":5297,"line":5309},[5295,12669,5302],{"class":5301},[5295,12671,12672],{"class":5305}," \u003Cvector>\n",[5295,12674,12675],{"class":5297,"line":5317},[5295,12676,5321],{"emptyLinePlaceholder":5320},[5295,12678,12679,12681],{"class":5297,"line":5324},[5295,12680,5328],{"class":5327},[5295,12682,12683],{"class":5331}," Widget\n",[5295,12685,12686],{"class":5297,"line":5335},[5295,12687,5339],{"class":5338},[5295,12689,12690],{"class":5297,"line":5342},[5295,12691,5345],{"class":5327},[5295,12693,12694,12697,12700,12702,12705],{"class":5297,"line":5348},[5295,12695,12696],{"class":5327},"    int",[5295,12698,12699],{"class":5360}," x",[5295,12701,7913],{"class":5338},[5295,12703,12704],{"class":5360},"y",[5295,12706,5364],{"class":5338},[5295,12708,12709,12711,12714,12716,12719],{"class":5297,"line":5367},[5295,12710,12696],{"class":5327},[5295,12712,12713],{"class":5360}," width",[5295,12715,7913],{"class":5338},[5295,12717,12718],{"class":5360},"height",[5295,12720,5364],{"class":5338},[5295,12722,12723],{"class":5297,"line":5372},[5295,12724,5321],{"emptyLinePlaceholder":5320},[5295,12726,12727],{"class":5297,"line":5378},[5295,12728,5375],{"class":5327},[5295,12730,12731,12734,12736,12738,12741,12743,12745,12748,12750,12752,12755,12757,12759,12762],{"class":5297,"line":5412},[5295,12732,12733],{"class":5381},"    Widget",[5295,12735,5385],{"class":5338},[5295,12737,5666],{"class":5327},[5295,12739,12740],{"class":5360}," posX",[5295,12742,7913],{"class":5338},[5295,12744,5666],{"class":5327},[5295,12746,12747],{"class":5360}," posY",[5295,12749,7913],{"class":5338},[5295,12751,5666],{"class":5327},[5295,12753,12754],{"class":5360}," w",[5295,12756,7913],{"class":5338},[5295,12758,5666],{"class":5327},[5295,12760,12761],{"class":5360}," h",[5295,12763,5594],{"class":5338},[5295,12765,12766,12769,12772,12774,12777,12779,12781,12783,12786,12788,12791,12793,12796,12798,12800,12802,12805],{"class":5297,"line":5418},[5295,12767,12768],{"class":5338},"        : ",[5295,12770,12771],{"class":5381},"x",[5295,12773,5385],{"class":5338},[5295,12775,12776],{"class":5360},"posX",[5295,12778,8413],{"class":5338},[5295,12780,12704],{"class":5381},[5295,12782,5385],{"class":5338},[5295,12784,12785],{"class":5360},"posY",[5295,12787,8413],{"class":5338},[5295,12789,12790],{"class":5381},"width",[5295,12792,5385],{"class":5338},[5295,12794,12795],{"class":5360},"w",[5295,12797,8413],{"class":5338},[5295,12799,12718],{"class":5381},[5295,12801,5385],{"class":5338},[5295,12803,12804],{"class":5360},"h",[5295,12806,5409],{"class":5338},[5295,12808,12809],{"class":5297,"line":5447},[5295,12810,5415],{"class":5338},[5295,12812,12813,12815,12818],{"class":5297,"line":5472},[5295,12814,7354],{"class":5327},[5295,12816,12817],{"class":5381}," ~Widget",[5295,12819,12820],{"class":5338},"() {}\n",[5295,12822,12823],{"class":5297,"line":5478},[5295,12824,5415],{"class":5338},[5295,12826,12827,12829,12831,12834],{"class":5297,"line":5483},[5295,12828,7354],{"class":5327},[5295,12830,9666],{"class":5327},[5295,12832,12833],{"class":5381}," onClick",[5295,12835,5672],{"class":5338},[5295,12837,12838],{"class":5297,"line":5499},[5295,12839,10059],{"class":5338},[5295,12841,12842,12844,12846,12848,12850,12853,12855,12857],{"class":5297,"line":5504},[5295,12843,8512],{"class":5331},[5295,12845,5354],{"class":5338},[5295,12847,5609],{"class":5360},[5295,12849,5612],{"class":5338},[5295,12851,12852],{"class":5305},"\"Widget: базова обробка кліку",[5295,12854,5645],{"class":5644},[5295,12856,5641],{"class":5305},[5295,12858,5364],{"class":5338},[5295,12860,12861],{"class":5297,"line":5509},[5295,12862,8546],{"class":5338},[5295,12864,12865],{"class":5297,"line":5535},[5295,12866,5415],{"class":5338},[5295,12868,12869,12871,12873,12876,12878,12881,12884],{"class":5297,"line":5540},[5295,12870,7354],{"class":5327},[5295,12872,9666],{"class":5327},[5295,12874,12875],{"class":5381}," onKeyPress",[5295,12877,5385],{"class":5338},[5295,12879,12880],{"class":5327},"char",[5295,12882,12883],{"class":5360}," key",[5295,12885,5594],{"class":5338},[5295,12887,12888],{"class":5297,"line":5562},[5295,12889,10059],{"class":5338},[5295,12891,12892,12894,12896,12898,12900,12903,12905,12908,12910,12912,12914,12916],{"class":5297,"line":5567},[5295,12893,8512],{"class":5331},[5295,12895,5354],{"class":5338},[5295,12897,5609],{"class":5360},[5295,12899,5612],{"class":5338},[5295,12901,12902],{"class":5305},"\"Widget: базова обробка клавіші \"",[5295,12904,5612],{"class":5338},[5295,12906,12907],{"class":5360},"key",[5295,12909,5612],{"class":5338},[5295,12911,5641],{"class":5305},[5295,12913,5645],{"class":5644},[5295,12915,5641],{"class":5305},[5295,12917,5364],{"class":5338},[5295,12919,12920],{"class":5297,"line":5572},[5295,12921,8546],{"class":5338},[5295,12923,12924],{"class":5297,"line":5597},[5295,12925,5415],{"class":5338},[5295,12927,12928,12930,12932,12935,12937],{"class":5297,"line":5602},[5295,12929,7354],{"class":5327},[5295,12931,9666],{"class":5327},[5295,12933,12934],{"class":5381}," render",[5295,12936,5430],{"class":5338},[5295,12938,10054],{"class":5327},[5295,12940,12941],{"class":5297,"line":5652},[5295,12942,10059],{"class":5338},[5295,12944,12945,12947,12949,12951,12953,12956,12958,12960],{"class":5297,"line":5658},[5295,12946,8512],{"class":5331},[5295,12948,5354],{"class":5338},[5295,12950,5609],{"class":5360},[5295,12952,5612],{"class":5338},[5295,12954,12955],{"class":5305},"\"Widget: рендеринг базового віджета",[5295,12957,5645],{"class":5644},[5295,12959,5641],{"class":5305},[5295,12961,5364],{"class":5338},[5295,12963,12964],{"class":5297,"line":5663},[5295,12965,8546],{"class":5338},[5295,12967,12968],{"class":5297,"line":5675},[5295,12969,5475],{"class":5338},[5295,12971,12972],{"class":5297,"line":5680},[5295,12973,5321],{"emptyLinePlaceholder":5320},[5295,12975,12976,12978,12981,12983,12985],{"class":5297,"line":5696},[5295,12977,5328],{"class":5327},[5295,12979,12980],{"class":5331}," Button",[5295,12982,5491],{"class":5338},[5295,12984,5494],{"class":5327},[5295,12986,12683],{"class":5331},[5295,12988,12989],{"class":5297,"line":5714},[5295,12990,5339],{"class":5338},[5295,12992,12993],{"class":5297,"line":5719},[5295,12994,12995],{"class":5327},"private:\n",[5295,12997,12998,13000,13002,13004,13007],{"class":5297,"line":5731},[5295,12999,5351],{"class":5331},[5295,13001,5354],{"class":5338},[5295,13003,5357],{"class":5331},[5295,13005,13006],{"class":5360}," label",[5295,13008,5364],{"class":5338},[5295,13010,13011],{"class":5297,"line":6354},[5295,13012,5321],{"emptyLinePlaceholder":5320},[5295,13014,13015],{"class":5297,"line":6387},[5295,13016,5375],{"class":5327},[5295,13018,13019,13022,13024,13026,13028,13030,13032,13035,13037,13039,13041,13043,13045,13047,13049,13051,13053,13055,13058],{"class":5297,"line":6392},[5295,13020,13021],{"class":5381},"    Button",[5295,13023,5385],{"class":5338},[5295,13025,5666],{"class":5327},[5295,13027,12699],{"class":5360},[5295,13029,7913],{"class":5338},[5295,13031,5666],{"class":5327},[5295,13033,13034],{"class":5360}," y",[5295,13036,7913],{"class":5338},[5295,13038,5666],{"class":5327},[5295,13040,12754],{"class":5360},[5295,13042,7913],{"class":5338},[5295,13044,5666],{"class":5327},[5295,13046,12761],{"class":5360},[5295,13048,7913],{"class":5338},[5295,13050,5388],{"class":5331},[5295,13052,5354],{"class":5338},[5295,13054,5357],{"class":5331},[5295,13056,13057],{"class":5360}," lbl",[5295,13059,5594],{"class":5338},[5295,13061,13062,13064,13067,13069,13071,13073,13075,13077,13079,13081,13083,13085,13088,13090,13093],{"class":5297,"line":6401},[5295,13063,12768],{"class":5338},[5295,13065,13066],{"class":5381},"Widget",[5295,13068,5385],{"class":5338},[5295,13070,12771],{"class":5360},[5295,13072,7913],{"class":5338},[5295,13074,12704],{"class":5360},[5295,13076,7913],{"class":5338},[5295,13078,12795],{"class":5360},[5295,13080,7913],{"class":5338},[5295,13082,12804],{"class":5360},[5295,13084,8413],{"class":5338},[5295,13086,13087],{"class":5381},"label",[5295,13089,5385],{"class":5338},[5295,13091,13092],{"class":5360},"lbl",[5295,13094,5409],{"class":5338},[5295,13096,13097],{"class":5297,"line":9032},[5295,13098,5415],{"class":5338},[5295,13100,13101,13103,13105,13107],{"class":5297,"line":9045},[5295,13102,6170],{"class":5327},[5295,13104,12833],{"class":5381},[5295,13106,5430],{"class":5338},[5295,13108,13109],{"class":5327},"override\n",[5295,13111,13112],{"class":5297,"line":9059},[5295,13113,10059],{"class":5338},[5295,13115,13116,13118,13120,13122,13124,13127,13129,13131,13133,13136,13138,13140],{"class":5297,"line":9073},[5295,13117,8512],{"class":5331},[5295,13119,5354],{"class":5338},[5295,13121,5609],{"class":5360},[5295,13123,5612],{"class":5338},[5295,13125,13126],{"class":5305},"\"Button [\"",[5295,13128,5612],{"class":5338},[5295,13130,13087],{"class":5360},[5295,13132,5612],{"class":5338},[5295,13134,13135],{"class":5305},"\"]: виконання дії кнопки",[5295,13137,5645],{"class":5644},[5295,13139,5641],{"class":5305},[5295,13141,5364],{"class":5338},[5295,13143,13144],{"class":5297,"line":9078},[5295,13145,8546],{"class":5338},[5295,13147,13148],{"class":5297,"line":9084},[5295,13149,5415],{"class":5338},[5295,13151,13152,13154,13156,13158,13160],{"class":5297,"line":9121},[5295,13153,6170],{"class":5327},[5295,13155,12934],{"class":5381},[5295,13157,5430],{"class":5338},[5295,13159,5433],{"class":5327},[5295,13161,10340],{"class":5327},[5295,13163,13164],{"class":5297,"line":9126},[5295,13165,10059],{"class":5338},[5295,13167,13168,13170,13172,13174,13176,13179,13181,13183,13185,13188,13190,13192],{"class":5297,"line":9146},[5295,13169,8512],{"class":5331},[5295,13171,5354],{"class":5338},[5295,13173,5609],{"class":5360},[5295,13175,5612],{"class":5338},[5295,13177,13178],{"class":5305},"\"Button: малюю кнопку з текстом '\"",[5295,13180,5612],{"class":5338},[5295,13182,13087],{"class":5360},[5295,13184,5612],{"class":5338},[5295,13186,13187],{"class":5305},"\"'",[5295,13189,5645],{"class":5644},[5295,13191,5641],{"class":5305},[5295,13193,5364],{"class":5338},[5295,13195,13196],{"class":5297,"line":9176},[5295,13197,8546],{"class":5338},[5295,13199,13200],{"class":5297,"line":9207},[5295,13201,5475],{"class":5338},[5295,13203,13204],{"class":5297,"line":9237},[5295,13205,5321],{"emptyLinePlaceholder":5320},[5295,13207,13208,13210,13213,13215,13217],{"class":5297,"line":9242},[5295,13209,5328],{"class":5327},[5295,13211,13212],{"class":5331}," TextField",[5295,13214,5491],{"class":5338},[5295,13216,5494],{"class":5327},[5295,13218,12683],{"class":5331},[5295,13220,13221],{"class":5297,"line":9247},[5295,13222,5339],{"class":5338},[5295,13224,13225],{"class":5297,"line":9256},[5295,13226,12995],{"class":5327},[5295,13228,13230,13232,13234,13236,13239],{"class":5297,"line":13229},55,[5295,13231,5351],{"class":5331},[5295,13233,5354],{"class":5338},[5295,13235,5357],{"class":5331},[5295,13237,13238],{"class":5360}," content",[5295,13240,5364],{"class":5338},[5295,13242,13244],{"class":5297,"line":13243},56,[5295,13245,5321],{"emptyLinePlaceholder":5320},[5295,13247,13249],{"class":5297,"line":13248},57,[5295,13250,5375],{"class":5327},[5295,13252,13254,13257,13259,13261,13263,13265,13267,13269,13271,13273,13275,13277,13279,13281],{"class":5297,"line":13253},58,[5295,13255,13256],{"class":5381},"    TextField",[5295,13258,5385],{"class":5338},[5295,13260,5666],{"class":5327},[5295,13262,12699],{"class":5360},[5295,13264,7913],{"class":5338},[5295,13266,5666],{"class":5327},[5295,13268,13034],{"class":5360},[5295,13270,7913],{"class":5338},[5295,13272,5666],{"class":5327},[5295,13274,12754],{"class":5360},[5295,13276,7913],{"class":5338},[5295,13278,5666],{"class":5327},[5295,13280,12761],{"class":5360},[5295,13282,5594],{"class":5338},[5295,13284,13286,13288,13290,13292,13294,13296,13298,13300,13302,13304,13306,13308,13311,13313,13316],{"class":5297,"line":13285},59,[5295,13287,12768],{"class":5338},[5295,13289,13066],{"class":5381},[5295,13291,5385],{"class":5338},[5295,13293,12771],{"class":5360},[5295,13295,7913],{"class":5338},[5295,13297,12704],{"class":5360},[5295,13299,7913],{"class":5338},[5295,13301,12795],{"class":5360},[5295,13303,7913],{"class":5338},[5295,13305,12804],{"class":5360},[5295,13307,8413],{"class":5338},[5295,13309,13310],{"class":5381},"content",[5295,13312,5385],{"class":5338},[5295,13314,13315],{"class":5305},"\"\"",[5295,13317,5409],{"class":5338},[5295,13319,13321],{"class":5297,"line":13320},60,[5295,13322,5415],{"class":5338},[5295,13324,13326,13328,13330,13332],{"class":5297,"line":13325},61,[5295,13327,6170],{"class":5327},[5295,13329,12833],{"class":5381},[5295,13331,5430],{"class":5338},[5295,13333,13109],{"class":5327},[5295,13335,13337],{"class":5297,"line":13336},62,[5295,13338,10059],{"class":5338},[5295,13340,13342,13344,13346,13348,13350,13353,13355,13357],{"class":5297,"line":13341},63,[5295,13343,8512],{"class":5331},[5295,13345,5354],{"class":5338},[5295,13347,5609],{"class":5360},[5295,13349,5612],{"class":5338},[5295,13351,13352],{"class":5305},"\"TextField: встановлення фокусу вводу",[5295,13354,5645],{"class":5644},[5295,13356,5641],{"class":5305},[5295,13358,5364],{"class":5338},[5295,13360,13362],{"class":5297,"line":13361},64,[5295,13363,8546],{"class":5338},[5295,13365,13367],{"class":5297,"line":13366},65,[5295,13368,5415],{"class":5338},[5295,13370,13372,13374,13376,13378,13380,13382,13385],{"class":5297,"line":13371},66,[5295,13373,6170],{"class":5327},[5295,13375,12875],{"class":5381},[5295,13377,5385],{"class":5338},[5295,13379,12880],{"class":5327},[5295,13381,12883],{"class":5360},[5295,13383,13384],{"class":5338},") ",[5295,13386,13109],{"class":5327},[5295,13388,13390],{"class":5297,"line":13389},67,[5295,13391,10059],{"class":5338},[5295,13393,13395,13398,13401,13403],{"class":5297,"line":13394},68,[5295,13396,13397],{"class":5360},"        content",[5295,13399,13400],{"class":5338}," += ",[5295,13402,12907],{"class":5360},[5295,13404,5364],{"class":5338},[5295,13406,13408,13410,13412,13414,13416,13419,13421,13423],{"class":5297,"line":13407},69,[5295,13409,8512],{"class":5331},[5295,13411,5354],{"class":5338},[5295,13413,5609],{"class":5360},[5295,13415,5612],{"class":5338},[5295,13417,13418],{"class":5305},"\"TextField: додано символ '\"",[5295,13420,5612],{"class":5338},[5295,13422,12907],{"class":5360},[5295,13424,13425],{"class":5338}," \n",[5295,13427,13429,13431,13434,13436,13438,13440,13442,13444,13446],{"class":5297,"line":13428},70,[5295,13430,9210],{"class":5338},[5295,13432,13433],{"class":5305},"\"', вміст: \"",[5295,13435,5612],{"class":5338},[5295,13437,13310],{"class":5360},[5295,13439,5612],{"class":5338},[5295,13441,5641],{"class":5305},[5295,13443,5645],{"class":5644},[5295,13445,5641],{"class":5305},[5295,13447,5364],{"class":5338},[5295,13449,13451],{"class":5297,"line":13450},71,[5295,13452,8546],{"class":5338},[5295,13454,13456],{"class":5297,"line":13455},72,[5295,13457,5415],{"class":5338},[5295,13459,13461,13463,13465,13467,13469],{"class":5297,"line":13460},73,[5295,13462,6170],{"class":5327},[5295,13464,12934],{"class":5381},[5295,13466,5430],{"class":5338},[5295,13468,5433],{"class":5327},[5295,13470,10340],{"class":5327},[5295,13472,13474],{"class":5297,"line":13473},74,[5295,13475,10059],{"class":5338},[5295,13477,13479,13481,13483,13485,13487,13490],{"class":5297,"line":13478},75,[5295,13480,8512],{"class":5331},[5295,13482,5354],{"class":5338},[5295,13484,5609],{"class":5360},[5295,13486,5612],{"class":5338},[5295,13488,13489],{"class":5305},"\"TextField: малюю текстове поле з вмістом '\"",[5295,13491,13425],{"class":5338},[5295,13493,13495,13497,13499,13501,13503,13505,13507],{"class":5297,"line":13494},76,[5295,13496,9210],{"class":5338},[5295,13498,13310],{"class":5360},[5295,13500,5612],{"class":5338},[5295,13502,13187],{"class":5305},[5295,13504,5645],{"class":5644},[5295,13506,5641],{"class":5305},[5295,13508,5364],{"class":5338},[5295,13510,13512],{"class":5297,"line":13511},77,[5295,13513,8546],{"class":5338},[5295,13515,13517],{"class":5297,"line":13516},78,[5295,13518,5475],{"class":5338},[5295,13520,13522],{"class":5297,"line":13521},79,[5295,13523,5321],{"emptyLinePlaceholder":5320},[5295,13525,13527,13529,13532,13534,13536],{"class":5297,"line":13526},80,[5295,13528,5328],{"class":5327},[5295,13530,13531],{"class":5331}," Slider",[5295,13533,5491],{"class":5338},[5295,13535,5494],{"class":5327},[5295,13537,12683],{"class":5331},[5295,13539,13541],{"class":5297,"line":13540},81,[5295,13542,5339],{"class":5338},[5295,13544,13546],{"class":5297,"line":13545},82,[5295,13547,12995],{"class":5327},[5295,13549,13551,13553,13556],{"class":5297,"line":13550},83,[5295,13552,12696],{"class":5327},[5295,13554,13555],{"class":5360}," value",[5295,13557,5364],{"class":5338},[5295,13559,13561,13563,13566,13568,13571],{"class":5297,"line":13560},84,[5295,13562,12696],{"class":5327},[5295,13564,13565],{"class":5360}," minValue",[5295,13567,7913],{"class":5338},[5295,13569,13570],{"class":5360},"maxValue",[5295,13572,5364],{"class":5338},[5295,13574,13576],{"class":5297,"line":13575},85,[5295,13577,5321],{"emptyLinePlaceholder":5320},[5295,13579,13581],{"class":5297,"line":13580},86,[5295,13582,5375],{"class":5327},[5295,13584,13586,13589,13591,13593,13595,13597,13599,13601,13603,13605,13607,13609,13611,13613,13615,13617,13620,13622,13624,13627],{"class":5297,"line":13585},87,[5295,13587,13588],{"class":5381},"    Slider",[5295,13590,5385],{"class":5338},[5295,13592,5666],{"class":5327},[5295,13594,12699],{"class":5360},[5295,13596,7913],{"class":5338},[5295,13598,5666],{"class":5327},[5295,13600,13034],{"class":5360},[5295,13602,7913],{"class":5338},[5295,13604,5666],{"class":5327},[5295,13606,12754],{"class":5360},[5295,13608,7913],{"class":5338},[5295,13610,5666],{"class":5327},[5295,13612,12761],{"class":5360},[5295,13614,7913],{"class":5338},[5295,13616,5666],{"class":5327},[5295,13618,13619],{"class":5360}," min",[5295,13621,7913],{"class":5338},[5295,13623,5666],{"class":5327},[5295,13625,13626],{"class":5360}," max",[5295,13628,5594],{"class":5338},[5295,13630,13632,13634,13636,13638,13640,13642,13644,13646,13648,13650,13652,13654,13657,13659,13662,13664,13667,13669,13671,13673,13675,13677,13680],{"class":5297,"line":13631},88,[5295,13633,12768],{"class":5338},[5295,13635,13066],{"class":5381},[5295,13637,5385],{"class":5338},[5295,13639,12771],{"class":5360},[5295,13641,7913],{"class":5338},[5295,13643,12704],{"class":5360},[5295,13645,7913],{"class":5338},[5295,13647,12795],{"class":5360},[5295,13649,7913],{"class":5338},[5295,13651,12804],{"class":5360},[5295,13653,8413],{"class":5338},[5295,13655,13656],{"class":5381},"value",[5295,13658,5385],{"class":5338},[5295,13660,13661],{"class":5360},"min",[5295,13663,8413],{"class":5338},[5295,13665,13666],{"class":5381},"minValue",[5295,13668,5385],{"class":5338},[5295,13670,13661],{"class":5360},[5295,13672,8413],{"class":5338},[5295,13674,13570],{"class":5381},[5295,13676,5385],{"class":5338},[5295,13678,13679],{"class":5360},"max",[5295,13681,5409],{"class":5338},[5295,13683,13685],{"class":5297,"line":13684},89,[5295,13686,5415],{"class":5338},[5295,13688,13690,13692,13694,13696],{"class":5297,"line":13689},90,[5295,13691,6170],{"class":5327},[5295,13693,12833],{"class":5381},[5295,13695,5430],{"class":5338},[5295,13697,13109],{"class":5327},[5295,13699,13701],{"class":5297,"line":13700},91,[5295,13702,10059],{"class":5338},[5295,13704,13706,13709,13712,13714,13717,13720,13723,13725,13728,13730,13732,13734,13736,13738],{"class":5297,"line":13705},92,[5295,13707,13708],{"class":5360},"        value",[5295,13710,13711],{"class":5338}," = (",[5295,13713,13656],{"class":5360},[5295,13715,13716],{"class":5338}," + ",[5295,13718,13719],{"class":5725},"10",[5295,13721,13722],{"class":5338}," \u003C= ",[5295,13724,13570],{"class":5360},[5295,13726,13727],{"class":5338},") ? ",[5295,13729,13656],{"class":5360},[5295,13731,13716],{"class":5338},[5295,13733,13719],{"class":5725},[5295,13735,5491],{"class":5338},[5295,13737,13570],{"class":5360},[5295,13739,5364],{"class":5338},[5295,13741,13743,13745,13747,13749,13751,13754,13756,13758,13760,13762,13764,13766],{"class":5297,"line":13742},93,[5295,13744,8512],{"class":5331},[5295,13746,5354],{"class":5338},[5295,13748,5609],{"class":5360},[5295,13750,5612],{"class":5338},[5295,13752,13753],{"class":5305},"\"Slider: нове значення \"",[5295,13755,5612],{"class":5338},[5295,13757,13656],{"class":5360},[5295,13759,5612],{"class":5338},[5295,13761,5641],{"class":5305},[5295,13763,5645],{"class":5644},[5295,13765,5641],{"class":5305},[5295,13767,5364],{"class":5338},[5295,13769,13771],{"class":5297,"line":13770},94,[5295,13772,8546],{"class":5338},[5295,13774,13776],{"class":5297,"line":13775},95,[5295,13777,5415],{"class":5338},[5295,13779,13781,13783,13785,13787,13789],{"class":5297,"line":13780},96,[5295,13782,6170],{"class":5327},[5295,13784,12934],{"class":5381},[5295,13786,5430],{"class":5338},[5295,13788,5433],{"class":5327},[5295,13790,10340],{"class":5327},[5295,13792,13794],{"class":5297,"line":13793},97,[5295,13795,10059],{"class":5338},[5295,13797,13799,13801,13803,13805,13807,13810,13812,13814,13816,13818,13820,13822],{"class":5297,"line":13798},98,[5295,13800,8512],{"class":5331},[5295,13802,5354],{"class":5338},[5295,13804,5609],{"class":5360},[5295,13806,5612],{"class":5338},[5295,13808,13809],{"class":5305},"\"Slider: малюю слайдер зі значенням \"",[5295,13811,5612],{"class":5338},[5295,13813,13656],{"class":5360},[5295,13815,5612],{"class":5338},[5295,13817,5641],{"class":5305},[5295,13819,5645],{"class":5644},[5295,13821,5641],{"class":5305},[5295,13823,5364],{"class":5338},[5295,13825,13827],{"class":5297,"line":13826},99,[5295,13828,8546],{"class":5338},[5295,13830,13832],{"class":5297,"line":13831},100,[5295,13833,5475],{"class":5338},[5295,13835,13837],{"class":5297,"line":13836},101,[5295,13838,5321],{"emptyLinePlaceholder":5320},[5295,13840,13842,13844,13846],{"class":5297,"line":13841},102,[5295,13843,5666],{"class":5327},[5295,13845,5669],{"class":5381},[5295,13847,5672],{"class":5338},[5295,13849,13851],{"class":5297,"line":13850},103,[5295,13852,5339],{"class":5338},[5295,13854,13856],{"class":5297,"line":13855},104,[5295,13857,13858],{"class":5710},"    \u002F\u002F Створюємо різні віджети\n",[5295,13860,13862,13864,13867,13869,13871,13873,13875,13877,13880,13882,13885,13887,13890],{"class":5297,"line":13861},105,[5295,13863,13021],{"class":5331},[5295,13865,13866],{"class":5381}," btnSubmit",[5295,13868,5385],{"class":5338},[5295,13870,13719],{"class":5725},[5295,13872,7913],{"class":5338},[5295,13874,13719],{"class":5725},[5295,13876,7913],{"class":5338},[5295,13878,13879],{"class":5725},"100",[5295,13881,7913],{"class":5338},[5295,13883,13884],{"class":5725},"30",[5295,13886,7913],{"class":5338},[5295,13888,13889],{"class":5305},"\"Submit\"",[5295,13891,5693],{"class":5338},[5295,13893,13895,13897,13900,13902,13904,13906,13909,13911,13914,13916,13918],{"class":5297,"line":13894},106,[5295,13896,13256],{"class":5331},[5295,13898,13899],{"class":5381}," inputName",[5295,13901,5385],{"class":5338},[5295,13903,13719],{"class":5725},[5295,13905,7913],{"class":5338},[5295,13907,13908],{"class":5725},"50",[5295,13910,7913],{"class":5338},[5295,13912,13913],{"class":5725},"200",[5295,13915,7913],{"class":5338},[5295,13917,13884],{"class":5725},[5295,13919,5693],{"class":5338},[5295,13921,13923,13925,13928,13930,13932,13934,13937,13939,13942,13944,13947,13949,13951,13953,13955],{"class":5297,"line":13922},107,[5295,13924,13588],{"class":5331},[5295,13926,13927],{"class":5381}," volumeControl",[5295,13929,5385],{"class":5338},[5295,13931,13719],{"class":5725},[5295,13933,7913],{"class":5338},[5295,13935,13936],{"class":5725},"90",[5295,13938,7913],{"class":5338},[5295,13940,13941],{"class":5725},"150",[5295,13943,7913],{"class":5338},[5295,13945,13946],{"class":5725},"20",[5295,13948,7913],{"class":5338},[5295,13950,8488],{"class":5725},[5295,13952,7913],{"class":5338},[5295,13954,13879],{"class":5725},[5295,13956,5693],{"class":5338},[5295,13958,13960],{"class":5297,"line":13959},108,[5295,13961,5415],{"class":5338},[5295,13963,13965],{"class":5297,"line":13964},109,[5295,13966,13967],{"class":5710},"    \u002F\u002F Поліморфна колекція: масив покажчиків на базовий клас Widget\n",[5295,13969,13971,13973,13975,13978,13980,13982,13985,13988,13991,13994,13996,13999,14001,14004],{"class":5297,"line":13970},110,[5295,13972,5351],{"class":5331},[5295,13974,5354],{"class":5338},[5295,13976,13977],{"class":5331},"vector",[5295,13979,10200],{"class":5338},[5295,13981,13066],{"class":5331},[5295,13983,13984],{"class":5338},"*> ",[5295,13986,13987],{"class":5360},"widgets",[5295,13989,13990],{"class":5338}," = { &",[5295,13992,13993],{"class":5360},"btnSubmit",[5295,13995,9099],{"class":5338},[5295,13997,13998],{"class":5360},"inputName",[5295,14000,9099],{"class":5338},[5295,14002,14003],{"class":5360},"volumeControl",[5295,14005,9118],{"class":5338},[5295,14007,14009],{"class":5297,"line":14008},111,[5295,14010,5415],{"class":5338},[5295,14012,14014,14016,14018,14020,14022,14025,14027,14029],{"class":5297,"line":14013},112,[5295,14015,5351],{"class":5331},[5295,14017,5354],{"class":5338},[5295,14019,5609],{"class":5360},[5295,14021,5612],{"class":5338},[5295,14023,14024],{"class":5305},"\"=== Рендеринг усіх віджетів ===",[5295,14026,5645],{"class":5644},[5295,14028,5641],{"class":5305},[5295,14030,5364],{"class":5338},[5295,14032,14034,14036,14038,14040,14042,14044,14046,14048],{"class":5297,"line":14033},113,[5295,14035,8476],{"class":5301},[5295,14037,5805],{"class":5338},[5295,14039,13066],{"class":5331},[5295,14041,6241],{"class":5327},[5295,14043,12754],{"class":5360},[5295,14045,5491],{"class":5338},[5295,14047,13987],{"class":5360},[5295,14049,14050],{"class":5338},") {\n",[5295,14052,14054,14057,14059,14062],{"class":5297,"line":14053},114,[5295,14055,14056],{"class":5360},"        w",[5295,14058,6339],{"class":5338},[5295,14060,14061],{"class":5381},"render",[5295,14063,14064],{"class":5338},"();\n",[5295,14066,14068],{"class":5297,"line":14067},115,[5295,14069,8546],{"class":5338},[5295,14071,14073],{"class":5297,"line":14072},116,[5295,14074,5415],{"class":5338},[5295,14076,14078,14080,14082,14084,14086,14088,14090,14093,14095,14097],{"class":5297,"line":14077},117,[5295,14079,5351],{"class":5331},[5295,14081,5354],{"class":5338},[5295,14083,5609],{"class":5360},[5295,14085,5612],{"class":5338},[5295,14087,5641],{"class":5305},[5295,14089,5645],{"class":5644},[5295,14091,14092],{"class":5305},"=== Симуляція кліків ===",[5295,14094,5645],{"class":5644},[5295,14096,5641],{"class":5305},[5295,14098,5364],{"class":5338},[5295,14100,14102,14104,14106,14108,14110,14112,14114,14116],{"class":5297,"line":14101},118,[5295,14103,8476],{"class":5301},[5295,14105,5805],{"class":5338},[5295,14107,13066],{"class":5331},[5295,14109,6241],{"class":5327},[5295,14111,12754],{"class":5360},[5295,14113,5491],{"class":5338},[5295,14115,13987],{"class":5360},[5295,14117,14050],{"class":5338},[5295,14119,14121,14123,14125,14128],{"class":5297,"line":14120},119,[5295,14122,14056],{"class":5360},[5295,14124,6339],{"class":5338},[5295,14126,14127],{"class":5381},"onClick",[5295,14129,14064],{"class":5338},[5295,14131,14133],{"class":5297,"line":14132},120,[5295,14134,8546],{"class":5338},[5295,14136,14138],{"class":5297,"line":14137},121,[5295,14139,5415],{"class":5338},[5295,14141,14143,14145,14147,14149,14151,14153,14155,14158,14160,14162],{"class":5297,"line":14142},122,[5295,14144,5351],{"class":5331},[5295,14146,5354],{"class":5338},[5295,14148,5609],{"class":5360},[5295,14150,5612],{"class":5338},[5295,14152,5641],{"class":5305},[5295,14154,5645],{"class":5644},[5295,14156,14157],{"class":5305},"=== Симуляція введення у TextField ===",[5295,14159,5645],{"class":5644},[5295,14161,5641],{"class":5305},[5295,14163,5364],{"class":5338},[5295,14165,14167,14170,14172,14175,14177,14180],{"class":5297,"line":14166},123,[5295,14168,14169],{"class":5360},"    inputName",[5295,14171,5618],{"class":5338},[5295,14173,14174],{"class":5381},"onKeyPress",[5295,14176,5385],{"class":5338},[5295,14178,14179],{"class":5305},"'H'",[5295,14181,5693],{"class":5338},[5295,14183,14185,14187,14189,14191,14193,14196],{"class":5297,"line":14184},124,[5295,14186,14169],{"class":5360},[5295,14188,5618],{"class":5338},[5295,14190,14174],{"class":5381},[5295,14192,5385],{"class":5338},[5295,14194,14195],{"class":5305},"'i'",[5295,14197,5693],{"class":5338},[5295,14199,14201],{"class":5297,"line":14200},125,[5295,14202,5415],{"class":5338},[5295,14204,14206,14208,14210],{"class":5297,"line":14205},126,[5295,14207,5722],{"class":5301},[5295,14209,5726],{"class":5725},[5295,14211,5364],{"class":5338},[5295,14213,14215],{"class":5297,"line":14214},127,[5295,14216,5655],{"class":5338},[5761,14218,14221,14225,14229,14233,14237,14240,14243,14247,14251,14255,14258,14261,14265],{"title":14219,":cursor":14220},".\u002FEventHandling","false",[5765,14222,14224],{"className":14223},[5297],"=== Рендеринг усіх віджетів ===",[5765,14226,14228],{"className":14227},[5297],"Button: малюю кнопку з текстом 'Submit'",[5765,14230,14232],{"className":14231},[5297],"TextField: малюю текстове поле з вмістом ''",[5765,14234,14236],{"className":14235},[5297],"Slider: малюю слайдер зі значенням 0",[5765,14238],{"className":14239},[5297],[5765,14241,14092],{"className":14242},[5297],[5765,14244,14246],{"className":14245},[5297],"Button [Submit]: виконання дії кнопки",[5765,14248,14250],{"className":14249},[5297],"TextField: встановлення фокусу вводу",[5765,14252,14254],{"className":14253},[5297],"Slider: нове значення 10",[5765,14256],{"className":14257},[5297],[5765,14259,14157],{"className":14260},[5297],[5765,14262,14264],{"className":14263},[5297],"TextField: додано символ 'H', вміст: H",[5765,14266,14268],{"className":14267},[5297],"TextField: додано символ 'i', вміст: Hi",[5257,14270,14271,14272,14275,14276,7913,14279,7913,14282,14285],{},"Цей приклад демонструє ключову силу поліморфізму: ",[5742,14273,14274],{},"єдиний код обробки для різноманітних об'єктів",". Цикл рендерингу та цикл обробки кліків не знають і не повинні знати, з якими конкретними типами віджетів вони працюють. Коли ми додамо нові типи віджетів (",[5261,14277,14278],{},"Checkbox",[5261,14280,14281],{},"RadioButton",[5261,14283,14284],{},"ComboBox","), існуючі цикли продовжуватимуть працювати без жодних змін.",[7498,14287,14288,14291,14292,14295,14296,7855,14299,14302,14303,7913,14305,14307,14308,5618],{},[5742,14289,14290],{},"Стандартна практика в реальних проєктах",": замість зберігання сирих покажчиків (",[5261,14293,14294],{},"Widget*",") використовують розумні покажчики ",[5261,14297,14298],{},"std::unique_ptr\u003CWidget>",[5261,14300,14301],{},"std::shared_ptr\u003CWidget>",", які автоматично звільняють пам'ять. У поточному прикладі ми працюємо з локальними об'єктами (",[5261,14304,13993],{},[5261,14306,13998],{},"), тому зберігаємо їхні адреси в масиві — пам'ять звільниться автоматично при виході зі ",[5261,14309,14310],{},"main()",[5252,14312,14314,14315,14317],{"id":14313},"віртуальність-та-const-збіг-сигнатури-є-обовязковим","Віртуальність та ",[5261,14316,5433],{},": збіг сигнатури є обов'язковим",[5929,14319,14321],{"id":14320},"підступна-відмінність-const-змінює-сигнатуру","Підступна відмінність: const змінює сигнатуру",[5257,14323,14324,14325,14327],{},"Одна з найпоширеніших помилок початківців при роботі з віртуальними функціями — забути специфікатор ",[5261,14326,5433],{}," у перевизначенні. Розглянемо приклад:",[5285,14329,14332],{"className":5287,"code":14330,"filename":14331,"language":5290,"meta":5291,"style":5291},"#include \u003Ciostream>\n\nclass Animal\n{\npublic:\n    virtual const char* speak() const  \u002F\u002F ← const у кінці\n    { \n        return \"???\"; \n    }\n};\n\nclass Dog : public Animal\n{\npublic:\n    \u002F\u002F ❌ Забули const — це НЕ перевизначення!\n    virtual const char* speak()\n    { \n        return \"Woof\"; \n    }\n};\n\nint main()\n{\n    Dog barsik;\n    Animal* ptr = &barsik;\n    \n    std::cout \u003C\u003C \"ptr->speak() = \" \u003C\u003C ptr->speak() \u003C\u003C \"\\n\";\n    \n    return 0;\n}\n","ConstMismatch.cpp",[5261,14333,14334,14340,14344,14350,14354,14358,14375,14380,14388,14392,14396,14400,14412,14416,14420,14425,14437,14441,14449,14453,14457,14461,14469,14473,14481,14495,14499,14531,14535,14543],{"__ignoreMap":5291},[5295,14335,14336,14338],{"class":5297,"line":5298},[5295,14337,5302],{"class":5301},[5295,14339,5306],{"class":5305},[5295,14341,14342],{"class":5297,"line":5309},[5295,14343,5321],{"emptyLinePlaceholder":5320},[5295,14345,14346,14348],{"class":5297,"line":5317},[5295,14347,5328],{"class":5327},[5295,14349,5332],{"class":5331},[5295,14351,14352],{"class":5297,"line":5324},[5295,14353,5339],{"class":5338},[5295,14355,14356],{"class":5297,"line":5335},[5295,14357,5375],{"class":5327},[5295,14359,14360,14362,14364,14366,14368,14370,14372],{"class":5297,"line":5342},[5295,14361,7354],{"class":5327},[5295,14363,7357],{"class":5327},[5295,14365,5453],{"class":5327},[5295,14367,5456],{"class":5381},[5295,14369,5430],{"class":5338},[5295,14371,5433],{"class":5327},[5295,14373,14374],{"class":5710},"  \u002F\u002F ← const у кінці\n",[5295,14376,14377],{"class":5297,"line":5348},[5295,14378,14379],{"class":5338},"    { \n",[5295,14381,14382,14384,14386],{"class":5297,"line":5367},[5295,14383,10064],{"class":5301},[5295,14385,5467],{"class":5305},[5295,14387,11582],{"class":5338},[5295,14389,14390],{"class":5297,"line":5372},[5295,14391,8546],{"class":5338},[5295,14393,14394],{"class":5297,"line":5378},[5295,14395,5475],{"class":5338},[5295,14397,14398],{"class":5297,"line":5412},[5295,14399,5321],{"emptyLinePlaceholder":5320},[5295,14401,14402,14404,14406,14408,14410],{"class":5297,"line":5418},[5295,14403,5328],{"class":5327},[5295,14405,5488],{"class":5331},[5295,14407,5491],{"class":5338},[5295,14409,5494],{"class":5327},[5295,14411,5332],{"class":5331},[5295,14413,14414],{"class":5297,"line":5447},[5295,14415,5339],{"class":5338},[5295,14417,14418],{"class":5297,"line":5472},[5295,14419,5375],{"class":5327},[5295,14421,14422],{"class":5297,"line":5478},[5295,14423,14424],{"class":5710},"    \u002F\u002F ❌ Забули const — це НЕ перевизначення!\n",[5295,14426,14427,14429,14431,14433,14435],{"class":5297,"line":5483},[5295,14428,7354],{"class":5327},[5295,14430,7357],{"class":5327},[5295,14432,5453],{"class":5327},[5295,14434,5456],{"class":5381},[5295,14436,5672],{"class":5338},[5295,14438,14439],{"class":5297,"line":5499},[5295,14440,14379],{"class":5338},[5295,14442,14443,14445,14447],{"class":5297,"line":5504},[5295,14444,10064],{"class":5301},[5295,14446,5557],{"class":5305},[5295,14448,11582],{"class":5338},[5295,14450,14451],{"class":5297,"line":5509},[5295,14452,8546],{"class":5338},[5295,14454,14455],{"class":5297,"line":5535},[5295,14456,5475],{"class":5338},[5295,14458,14459],{"class":5297,"line":5540},[5295,14460,5321],{"emptyLinePlaceholder":5320},[5295,14462,14463,14465,14467],{"class":5297,"line":5562},[5295,14464,5666],{"class":5327},[5295,14466,5669],{"class":5381},[5295,14468,5672],{"class":5338},[5295,14470,14471],{"class":5297,"line":5567},[5295,14472,5339],{"class":5338},[5295,14474,14475,14477,14479],{"class":5297,"line":5572},[5295,14476,5512],{"class":5331},[5295,14478,5685],{"class":5360},[5295,14480,5364],{"class":5338},[5295,14482,14483,14485,14487,14489,14491,14493],{"class":5297,"line":5597},[5295,14484,5382],{"class":5331},[5295,14486,6241],{"class":5327},[5295,14488,9792],{"class":5360},[5295,14490,6247],{"class":5338},[5295,14492,5704],{"class":5360},[5295,14494,5364],{"class":5338},[5295,14496,14497],{"class":5297,"line":5602},[5295,14498,5415],{"class":5338},[5295,14500,14501,14503,14505,14507,14509,14512,14514,14517,14519,14521,14523,14525,14527,14529],{"class":5297,"line":5652},[5295,14502,5351],{"class":5331},[5295,14504,5354],{"class":5338},[5295,14506,5609],{"class":5360},[5295,14508,5612],{"class":5338},[5295,14510,14511],{"class":5305},"\"ptr->speak() = \"",[5295,14513,5612],{"class":5338},[5295,14515,14516],{"class":5360},"ptr",[5295,14518,6339],{"class":5338},[5295,14520,5636],{"class":5381},[5295,14522,5624],{"class":5338},[5295,14524,5641],{"class":5305},[5295,14526,5645],{"class":5644},[5295,14528,5641],{"class":5305},[5295,14530,5364],{"class":5338},[5295,14532,14533],{"class":5297,"line":5658},[5295,14534,5415],{"class":5338},[5295,14536,14537,14539,14541],{"class":5297,"line":5663},[5295,14538,5722],{"class":5301},[5295,14540,5726],{"class":5725},[5295,14542,5364],{"class":5338},[5295,14544,14545],{"class":5297,"line":5675},[5295,14546,5655],{"class":5338},[5761,14548,14550],{"title":14549},".\u002FConstMismatch",[5765,14551,14553],{"className":14552},[5297],"ptr->speak() = ???",[5257,14555,10756,14556,14559,14560,10764,14562,5745,14564,14566,14567,14569,14570,5805,14573,14575,14576,7119,14578,8129,14581,14584],{},[5261,14557,14558],{},"ptr->speak()"," виконує ",[5261,14561,5795],{},[5261,14563,5754],{},[5261,14565,5754],{}," не є перевизначенням — сигнатури різні. ",[5261,14568,5795],{}," — це ",[5742,14571,14572],{},"константний метод",[5261,14574,5433],{}," після параметрів), а ",[5261,14577,5754],{},[5742,14579,14580],{},"неконстантний метод",[5742,14582,14583],{},"різні сигнатури",", тому компілятор вважає їх незалежними методами.",[5257,14586,14587],{},"Компілятор не видає помилку, адже технічно можливо мати в одному класі два методи з однаковим ім'ям, але різними сигнатурами (це перевантаження). Проте це не те, що програміст мав на увазі — поліморфізм не працює.",[6601,14589,14590,9862,14592,7913,14594,14596,14597,14599,14600,14602],{},[5742,14591,9861],{},[5261,14593,5433],{},[5261,14595,5588],{}," або інший модифікатор у сигнатурі перевизначення. Код компілюється без попереджень, але поліморфізм не працює. Саме тому в C++11 був доданий специфікатор ",[5261,14598,5913],{}," — він змушує компілятор перевірити, чи дійсно метод є перевизначенням, і видати помилку, якщо сигнатури не збігаються. Ми детально розглянемо ",[5261,14601,5913],{}," у наступній статті.",[5929,14604,14606],{"id":14605},"правило-повної-відповідності-сигнатур","Правило повної відповідності сигнатур",[5257,14608,14609,14610,10169],{},"Щоб метод похідного класу вважався перевизначенням віртуального методу базового класу, ",[5742,14611,14612],{},"мають збігатися",[7285,14614,14615,14619,14624,14636,14643],{},[5837,14616,14617],{},[5742,14618,9623],{},[5837,14620,14621],{},[5742,14622,14623],{},"Кількість параметрів",[5837,14625,14626,14629,14630,7913,14632,7913,14634,10786],{},[5742,14627,14628],{},"Типи параметрів"," (включно з ",[5261,14631,5433],{},[5261,14633,5588],{},[5261,14635,6241],{},[5837,14637,14638,14642],{},[5742,14639,9629,14640],{},[5261,14641,5433],{}," після списку параметрів",[5837,14644,14645,14648],{},[5742,14646,14647],{},"Тип повернення"," (з винятком коваріантних типів)",[5257,14650,14651,14652,14654],{},"Якщо хоч один із цих аспектів різниться, метод ",[5742,14653,9638],{}," — це окремий метод, який може співіснувати з базовим методом (перевантаження).",[11528,14656,14657,14767,14866],{},[5285,14658,14661],{"className":5287,"code":14659,"filename":14660,"language":5290,"meta":5291,"style":5291},"class Base {\npublic:\n    virtual void process(int x) const {\n        \u002F\u002F ...\n    }\n};\n\nclass Derived : public Base {\npublic:\n    void process(int x) const override {\n        \u002F\u002F Сигнатури повністю збігаються\n    }\n};\n","✅ Валідне перевизначення",[5261,14662,14663,14672,14676,14697,14702,14706,14710,14714,14729,14733,14754,14759,14763],{"__ignoreMap":5291},[5295,14664,14665,14667,14670],{"class":5297,"line":5298},[5295,14666,5328],{"class":5327},[5295,14668,14669],{"class":5331}," Base",[5295,14671,11544],{"class":5338},[5295,14673,14674],{"class":5297,"line":5309},[5295,14675,5375],{"class":5327},[5295,14677,14678,14680,14682,14685,14687,14689,14691,14693,14695],{"class":5297,"line":5317},[5295,14679,7354],{"class":5327},[5295,14681,9666],{"class":5327},[5295,14683,14684],{"class":5381}," process",[5295,14686,5385],{"class":5338},[5295,14688,5666],{"class":5327},[5295,14690,12699],{"class":5360},[5295,14692,13384],{"class":5338},[5295,14694,5433],{"class":5327},[5295,14696,11544],{"class":5338},[5295,14698,14699],{"class":5297,"line":5324},[5295,14700,14701],{"class":5710},"        \u002F\u002F ...\n",[5295,14703,14704],{"class":5297,"line":5335},[5295,14705,8546],{"class":5338},[5295,14707,14708],{"class":5297,"line":5342},[5295,14709,5475],{"class":5338},[5295,14711,14712],{"class":5297,"line":5348},[5295,14713,5321],{"emptyLinePlaceholder":5320},[5295,14715,14716,14718,14721,14723,14725,14727],{"class":5297,"line":5367},[5295,14717,5328],{"class":5327},[5295,14719,14720],{"class":5331}," Derived",[5295,14722,5491],{"class":5338},[5295,14724,5494],{"class":5327},[5295,14726,14669],{"class":5331},[5295,14728,11544],{"class":5338},[5295,14730,14731],{"class":5297,"line":5372},[5295,14732,5375],{"class":5327},[5295,14734,14735,14737,14739,14741,14743,14745,14747,14749,14752],{"class":5297,"line":5378},[5295,14736,6170],{"class":5327},[5295,14738,14684],{"class":5381},[5295,14740,5385],{"class":5338},[5295,14742,5666],{"class":5327},[5295,14744,12699],{"class":5360},[5295,14746,13384],{"class":5338},[5295,14748,5433],{"class":5327},[5295,14750,14751],{"class":5327}," override",[5295,14753,11544],{"class":5338},[5295,14755,14756],{"class":5297,"line":5412},[5295,14757,14758],{"class":5710},"        \u002F\u002F Сигнатури повністю збігаються\n",[5295,14760,14761],{"class":5297,"line":5418},[5295,14762,8546],{"class":5338},[5295,14764,14765],{"class":5297,"line":5447},[5295,14766,5475],{"class":5338},[5285,14768,14771],{"className":5287,"code":14769,"filename":14770,"language":5290,"meta":5291,"style":5291},"class Base {\npublic:\n    virtual void process(int x) const {\n        \u002F\u002F ...\n    }\n};\n\nclass Derived : public Base {\npublic:\n    void process(int x) {\n        \u002F\u002F Сигнатури різні: const vs не-const\n    }\n};\n","❌ Не перевизначення: відсутній const",[5261,14772,14773,14781,14785,14805,14809,14813,14817,14821,14835,14839,14853,14858,14862],{"__ignoreMap":5291},[5295,14774,14775,14777,14779],{"class":5297,"line":5298},[5295,14776,5328],{"class":5327},[5295,14778,14669],{"class":5331},[5295,14780,11544],{"class":5338},[5295,14782,14783],{"class":5297,"line":5309},[5295,14784,5375],{"class":5327},[5295,14786,14787,14789,14791,14793,14795,14797,14799,14801,14803],{"class":5297,"line":5317},[5295,14788,7354],{"class":5327},[5295,14790,9666],{"class":5327},[5295,14792,14684],{"class":5381},[5295,14794,5385],{"class":5338},[5295,14796,5666],{"class":5327},[5295,14798,12699],{"class":5360},[5295,14800,13384],{"class":5338},[5295,14802,5433],{"class":5327},[5295,14804,11544],{"class":5338},[5295,14806,14807],{"class":5297,"line":5324},[5295,14808,14701],{"class":5710},[5295,14810,14811],{"class":5297,"line":5335},[5295,14812,8546],{"class":5338},[5295,14814,14815],{"class":5297,"line":5342},[5295,14816,5475],{"class":5338},[5295,14818,14819],{"class":5297,"line":5348},[5295,14820,5321],{"emptyLinePlaceholder":5320},[5295,14822,14823,14825,14827,14829,14831,14833],{"class":5297,"line":5367},[5295,14824,5328],{"class":5327},[5295,14826,14720],{"class":5331},[5295,14828,5491],{"class":5338},[5295,14830,5494],{"class":5327},[5295,14832,14669],{"class":5331},[5295,14834,11544],{"class":5338},[5295,14836,14837],{"class":5297,"line":5372},[5295,14838,5375],{"class":5327},[5295,14840,14841,14843,14845,14847,14849,14851],{"class":5297,"line":5378},[5295,14842,6170],{"class":5327},[5295,14844,14684],{"class":5381},[5295,14846,5385],{"class":5338},[5295,14848,5666],{"class":5327},[5295,14850,12699],{"class":5360},[5295,14852,14050],{"class":5338},[5295,14854,14855],{"class":5297,"line":5412},[5295,14856,14857],{"class":5710},"        \u002F\u002F Сигнатури різні: const vs не-const\n",[5295,14859,14860],{"class":5297,"line":5418},[5295,14861,8546],{"class":5338},[5295,14863,14864],{"class":5297,"line":5447},[5295,14865,5475],{"class":5338},[5285,14867,14870],{"className":5287,"code":14868,"filename":14869,"language":5290,"meta":5291,"style":5291},"class Base {\npublic:\n    virtual void process(int x) {\n        \u002F\u002F ...\n    }\n};\n\nclass Derived : public Base {\npublic:\n    void process(double x) {\n        \u002F\u002F Сигнатури різні: int vs double\n    }\n};\n","❌ Не перевизначення: інший тип параметра",[5261,14871,14872,14880,14884,14900,14904,14908,14912,14916,14930,14934,14948,14953,14957],{"__ignoreMap":5291},[5295,14873,14874,14876,14878],{"class":5297,"line":5298},[5295,14875,5328],{"class":5327},[5295,14877,14669],{"class":5331},[5295,14879,11544],{"class":5338},[5295,14881,14882],{"class":5297,"line":5309},[5295,14883,5375],{"class":5327},[5295,14885,14886,14888,14890,14892,14894,14896,14898],{"class":5297,"line":5317},[5295,14887,7354],{"class":5327},[5295,14889,9666],{"class":5327},[5295,14891,14684],{"class":5381},[5295,14893,5385],{"class":5338},[5295,14895,5666],{"class":5327},[5295,14897,12699],{"class":5360},[5295,14899,14050],{"class":5338},[5295,14901,14902],{"class":5297,"line":5324},[5295,14903,14701],{"class":5710},[5295,14905,14906],{"class":5297,"line":5335},[5295,14907,8546],{"class":5338},[5295,14909,14910],{"class":5297,"line":5342},[5295,14911,5475],{"class":5338},[5295,14913,14914],{"class":5297,"line":5348},[5295,14915,5321],{"emptyLinePlaceholder":5320},[5295,14917,14918,14920,14922,14924,14926,14928],{"class":5297,"line":5367},[5295,14919,5328],{"class":5327},[5295,14921,14720],{"class":5331},[5295,14923,5491],{"class":5338},[5295,14925,5494],{"class":5327},[5295,14927,14669],{"class":5331},[5295,14929,11544],{"class":5338},[5295,14931,14932],{"class":5297,"line":5372},[5295,14933,5375],{"class":5327},[5295,14935,14936,14938,14940,14942,14944,14946],{"class":5297,"line":5378},[5295,14937,6170],{"class":5327},[5295,14939,14684],{"class":5381},[5295,14941,5385],{"class":5338},[5295,14943,9985],{"class":5327},[5295,14945,12699],{"class":5360},[5295,14947,14050],{"class":5338},[5295,14949,14950],{"class":5297,"line":5412},[5295,14951,14952],{"class":5710},"        \u002F\u002F Сигнатури різні: int vs double\n",[5295,14954,14955],{"class":5297,"line":5418},[5295,14956,8546],{"class":5338},[5295,14958,14959],{"class":5297,"line":5447},[5295,14960,5475],{"class":5338},[5252,14962,14964],{"id":14963},"чому-віртуальні-функції-за-замовчуванням-не-є-стандартом","Чому віртуальні функції за замовчуванням не є стандартом",[5929,14966,14968],{"id":14967},"філософія-продуктивності-c","Філософія продуктивності C++",[5257,14970,14971,14972,5618],{},"Досвідчені розробники іноді запитують: «Якщо віртуальні функції настільки корисні, чому C++ не робить усі методи віртуальними за замовчуванням?» Деякі мови (наприклад, Java, C#) дійсно мають таку поведінку — всі методи віртуальні за замовчуванням, якщо їх явно не позначено як ",[5261,14973,10948],{},[5257,14975,14976],{},"Проте C++ обрав інший шлях, і на це є кілька причин:",[7285,14978,14979,14988,14993,15003],{},[5837,14980,14981,5805,14984,14987],{},[5742,14982,14983],{},"Принцип «ти не платиш за те, що не використовуєш»",[5807,14985,14986],{},"you don't pay for what you don't use","): C++ дотримується філософії нульових накладних витрат. Якщо програмісту не потрібен динамічний поліморфізм для конкретного методу, він не повинен платити за додатковий покажчик у кожному об'єкті та непрямі виклики.",[5837,14989,14990,14992],{},[5742,14991,7297],{},": C++ розроблявся як «C з класами» і зберігає максимальну сумісність із C. У C всі виклики функцій є прямими (статичне зв'язування), і зміна цієї поведінки за замовчуванням порушила б сумісність.",[5837,14994,14995,14998,14999,15002],{},[5742,14996,14997],{},"Оптимізації компілятора",": невіртуальні методи можуть бути вбудовані (",[5807,15000,15001],{},"inlined",") компілятором, що радикально підвищує продуктивність у критичних ділянках коду. Віртуальні методи блокують більшість оптимізацій.",[5837,15004,15005,15008,15009,15011],{},[5742,15006,15007],{},"Явність наміру",": необхідність явно позначати методи як ",[5261,15010,5852],{}," змушує програміста свідомо приймати рішення про архітектуру класу. Це частина філософії C++: «будь явним, а не неявним».",[6448,15013,15014,15017],{},[5742,15015,15016],{},"Коли все є віртуальним за замовчуванням",": мови Java та C# обрали протилежний підхід — усі методи віртуальні за замовчуванням (Java) або можуть бути віртуальними без явного позначення (C#). Це спрощує написання поліморфного коду, але накладає постійні витрати на всі виклики методів. C++ віддає програмісту контроль над продуктивністю за рахунок додаткового синтаксису.",[5929,15019,15021],{"id":15020},"коли-не-використовувати-віртуальні-функції","Коли НЕ використовувати віртуальні функції",[5257,15023,15024],{},"Віртуальні функції не є універсальним рішенням для всіх класів. Уникайте віртуальних методів у наступних випадках:",[5257,15026,15027],{},[5742,15028,15029],{},"1. Прості структури даних (POD — Plain Old Data)",[5285,15031,15033],{"className":5287,"code":15032,"language":5290,"meta":5291,"style":5291},"\u002F\u002F ❌ Не робіть це — Point не призначений для наслідування\nstruct Point\n{\n    double x, y;\n    \n    virtual double distance() const { return std::sqrt(x*x + y*y); }\n};\n",[5261,15034,15035,15040,15048,15052,15065,15069,15113],{"__ignoreMap":5291},[5295,15036,15037],{"class":5297,"line":5298},[5295,15038,15039],{"class":5710},"\u002F\u002F ❌ Не робіть це — Point не призначений для наслідування\n",[5295,15041,15042,15045],{"class":5297,"line":5309},[5295,15043,15044],{"class":5327},"struct",[5295,15046,15047],{"class":5331}," Point\n",[5295,15049,15050],{"class":5297,"line":5317},[5295,15051,5339],{"class":5338},[5295,15053,15054,15057,15059,15061,15063],{"class":5297,"line":5324},[5295,15055,15056],{"class":5327},"    double",[5295,15058,12699],{"class":5360},[5295,15060,7913],{"class":5338},[5295,15062,12704],{"class":5360},[5295,15064,5364],{"class":5338},[5295,15066,15067],{"class":5297,"line":5335},[5295,15068,5415],{"class":5338},[5295,15070,15071,15073,15075,15078,15080,15082,15084,15086,15089,15091,15094,15096,15098,15100,15102,15104,15106,15108,15110],{"class":5297,"line":5342},[5295,15072,7354],{"class":5327},[5295,15074,9957],{"class":5327},[5295,15076,15077],{"class":5381}," distance",[5295,15079,5430],{"class":5338},[5295,15081,5433],{"class":5327},[5295,15083,5436],{"class":5338},[5295,15085,5439],{"class":5301},[5295,15087,15088],{"class":5331}," std",[5295,15090,5354],{"class":5338},[5295,15092,15093],{"class":5381},"sqrt",[5295,15095,5385],{"class":5338},[5295,15097,12771],{"class":5360},[5295,15099,6241],{"class":5338},[5295,15101,12771],{"class":5360},[5295,15103,13716],{"class":5338},[5295,15105,12704],{"class":5360},[5295,15107,6241],{"class":5338},[5295,15109,12704],{"class":5360},[5295,15111,15112],{"class":5338},"); }\n",[5295,15114,15115],{"class":5297,"line":5348},[5295,15116,5475],{"class":5338},[5257,15118,15119,15120,15123],{},"Структури даних без поведінкової логіки не потребують поліморфізму. Додавання віртуального методу збільшує розмір кожного об'єкта ",[5261,15121,15122],{},"Point"," на 8 байт (покажчик на vtable) і блокує оптимізації.",[5257,15125,15126],{},[5742,15127,15128],{},"2. Фінальні класи, не призначені для наслідування",[5285,15130,15132],{"className":5287,"code":15131,"language":5290,"meta":5291,"style":5291},"class MathUtils  \u002F\u002F Утилітний клас без наслідників\n{\npublic:\n    static double sqrt(double x) { \u002F* ... *\u002F }\n    static double pow(double x, double y) { \u002F* ... *\u002F }\n};\n",[5261,15133,15134,15144,15148,15152,15177,15204],{"__ignoreMap":5291},[5295,15135,15136,15138,15141],{"class":5297,"line":5298},[5295,15137,5328],{"class":5327},[5295,15139,15140],{"class":5331}," MathUtils",[5295,15142,15143],{"class":5710},"  \u002F\u002F Утилітний клас без наслідників\n",[5295,15145,15146],{"class":5297,"line":5309},[5295,15147,5339],{"class":5338},[5295,15149,15150],{"class":5297,"line":5317},[5295,15151,5375],{"class":5327},[5295,15153,15154,15157,15159,15162,15164,15166,15168,15171,15174],{"class":5297,"line":5324},[5295,15155,15156],{"class":5327},"    static",[5295,15158,9957],{"class":5327},[5295,15160,15161],{"class":5381}," sqrt",[5295,15163,5385],{"class":5338},[5295,15165,9985],{"class":5327},[5295,15167,12699],{"class":5360},[5295,15169,15170],{"class":5338},") {",[5295,15172,15173],{"class":5710}," \u002F* ... *\u002F",[5295,15175,15176],{"class":5338}," }\n",[5295,15178,15179,15181,15183,15186,15188,15190,15192,15194,15196,15198,15200,15202],{"class":5297,"line":5335},[5295,15180,15156],{"class":5327},[5295,15182,9957],{"class":5327},[5295,15184,15185],{"class":5381}," pow",[5295,15187,5385],{"class":5338},[5295,15189,9985],{"class":5327},[5295,15191,12699],{"class":5360},[5295,15193,7913],{"class":5338},[5295,15195,9985],{"class":5327},[5295,15197,13034],{"class":5360},[5295,15199,15170],{"class":5338},[5295,15201,15173],{"class":5710},[5295,15203,15176],{"class":5338},[5295,15205,15206],{"class":5297,"line":5342},[5295,15207,5475],{"class":5338},[5257,15209,15210],{},"Якщо клас не призначений для наслідування (утилітні класи, класи зі статичними методами), віртуальні функції не мають сенсу.",[5257,15212,15213],{},[5742,15214,15215],{},"3. Гарячі цикли з критичною продуктивністю",[5257,15217,15218,15219,15222],{},"У вузьких місцях коду, що виконуються мільйони разів на секунду (наприклад, внутрішні цикли обробки зображень, фізичні симуляції), накладні витрати віртуальних викликів можуть бути відчутними. У таких випадках краще використовувати шаблони (",[5807,15220,15221],{},"templates",") замість поліморфізму.",[7498,15224,15225,15228],{},[5742,15226,15227],{},"Правило здорового глузду",": якщо клас має лише один або два методи і не планується його успадкування, віртуальність зайва. Якщо клас моделює абстракцію, яка має кілька реалізацій (тварина → кіт\u002Fсобака, фігура → коло\u002Fпрямокутник), віртуальні функції — природний і правильний вибір.",[5252,15230,15232],{"id":15231},"розширені-сценарії-поліморфізм-у-складних-системах","Розширені сценарії: поліморфізм у складних системах",[5929,15234,15236],{"id":15235},"фабричний-метод-та-динамічне-створення-обєктів","Фабричний метод та динамічне створення об'єктів",[5257,15238,15239,15240,5805,15243,15246],{},"У реальних проєктах часто виникає потреба динамічно створювати об'єкти різних типів на основі зовнішніх даних (наприклад, конфігураційних файлів, запитів користувача, мережевих повідомлень). Поліморфізм дозволяє реалізувати ",[5742,15241,15242],{},"фабричний метод",[5807,15244,15245],{},"factory method",") — функцію, що повертає покажчик на базовий клас, але створює об'єкт конкретного похідного класу:",[5285,15248,15251],{"className":5287,"code":15249,"filename":15250,"language":5290,"meta":5291,"style":5291},"#include \u003Ciostream>\n#include \u003Cmemory>\n#include \u003Cstring>\n\nclass Animal\n{\nprotected:\n    std::string name;\n\npublic:\n    Animal(std::string n) : name(n) {}\n    virtual ~Animal() {}\n    \n    std::string getName() const { return name; }\n    virtual const char* speak() const = 0;  \u002F\u002F Чисто віртуальна функція (абстрактний клас)\n};\n\nclass Cat : public Animal\n{\npublic:\n    Cat(std::string n) : Animal(n) {}\n    const char* speak() const override { return \"Meow\"; }\n};\n\nclass Dog : public Animal\n{\npublic:\n    Dog(std::string n) : Animal(n) {}\n    const char* speak() const override { return \"Woof\"; }\n};\n\nclass Bird : public Animal\n{\npublic:\n    Bird(std::string n) : Animal(n) {}\n    const char* speak() const override { return \"Tweet\"; }\n};\n\n\u002F\u002F Фабричний метод: створює тварину на основі типу\nstd::unique_ptr\u003CAnimal> createAnimal(const std::string& type, const std::string& name)\n{\n    if (type == \"cat\") {\n        return std::make_unique\u003CCat>(name);\n    } else if (type == \"dog\") {\n        return std::make_unique\u003CDog>(name);\n    } else if (type == \"bird\") {\n        return std::make_unique\u003CBird>(name);\n    } else {\n        return nullptr;\n    }\n}\n\nint main()\n{\n    \u002F\u002F Імітація введення користувача або конфігураційного файлу\n    std::string types[] = { \"cat\", \"dog\", \"bird\", \"cat\" };\n    std::string names[] = { \"Мурка\", \"Барсік\", \"Кеша\", \"Рижик\" };\n    \n    std::vector\u003Cstd::unique_ptr\u003CAnimal>> zoo;\n    \n    for (int i = 0; i \u003C 4; i++) {\n        auto animal = createAnimal(types[i], names[i]);\n        if (animal) {\n            zoo.push_back(std::move(animal));\n        }\n    }\n    \n    std::cout \u003C\u003C \"Тварини в зоопарку:\\n\";\n    for (const auto& animal : zoo) {\n        std::cout \u003C\u003C \"  \" \u003C\u003C animal->getName() \n                  \u003C\u003C \" каже \" \u003C\u003C animal->speak() \u003C\u003C \"\\n\";\n    }\n    \n    return 0;\n}\n","FactoryMethod.cpp",[5261,15252,15253,15259,15266,15272,15276,15282,15286,15290,15302,15306,15310,15334,15343,15347,15369,15392,15396,15400,15412,15416,15420,15444,15466,15470,15474,15486,15490,15494,15518,15540,15544,15548,15560,15564,15568,15592,15614,15618,15622,15627,15677,15681,15699,15721,15743,15763,15782,15802,15810,15819,15823,15827,15831,15839,15843,15848,15877,15906,15910,15938,15942,15971,16004,16015,16040,16045,16049,16053,16072,16091,16113,16137,16141,16145,16153],{"__ignoreMap":5291},[5295,15254,15255,15257],{"class":5297,"line":5298},[5295,15256,5302],{"class":5301},[5295,15258,5306],{"class":5305},[5295,15260,15261,15263],{"class":5297,"line":5309},[5295,15262,5302],{"class":5301},[5295,15264,15265],{"class":5305}," \u003Cmemory>\n",[5295,15267,15268,15270],{"class":5297,"line":5317},[5295,15269,5302],{"class":5301},[5295,15271,5314],{"class":5305},[5295,15273,15274],{"class":5297,"line":5324},[5295,15275,5321],{"emptyLinePlaceholder":5320},[5295,15277,15278,15280],{"class":5297,"line":5335},[5295,15279,5328],{"class":5327},[5295,15281,5332],{"class":5331},[5295,15283,15284],{"class":5297,"line":5342},[5295,15285,5339],{"class":5338},[5295,15287,15288],{"class":5297,"line":5348},[5295,15289,5345],{"class":5327},[5295,15291,15292,15294,15296,15298,15300],{"class":5297,"line":5367},[5295,15293,5351],{"class":5331},[5295,15295,5354],{"class":5338},[5295,15297,5357],{"class":5331},[5295,15299,5361],{"class":5360},[5295,15301,5364],{"class":5338},[5295,15303,15304],{"class":5297,"line":5372},[5295,15305,5321],{"emptyLinePlaceholder":5320},[5295,15307,15308],{"class":5297,"line":5378},[5295,15309,5375],{"class":5327},[5295,15311,15312,15314,15316,15318,15320,15322,15324,15326,15328,15330,15332],{"class":5297,"line":5412},[5295,15313,5382],{"class":5381},[5295,15315,5385],{"class":5338},[5295,15317,5388],{"class":5331},[5295,15319,5354],{"class":5338},[5295,15321,5357],{"class":5331},[5295,15323,5395],{"class":5360},[5295,15325,5398],{"class":5338},[5295,15327,5401],{"class":5381},[5295,15329,5385],{"class":5338},[5295,15331,5406],{"class":5360},[5295,15333,5409],{"class":5338},[5295,15335,15336,15338,15341],{"class":5297,"line":5418},[5295,15337,7354],{"class":5327},[5295,15339,15340],{"class":5381}," ~Animal",[5295,15342,12820],{"class":5338},[5295,15344,15345],{"class":5297,"line":5447},[5295,15346,5415],{"class":5338},[5295,15348,15349,15351,15353,15355,15357,15359,15361,15363,15365,15367],{"class":5297,"line":5472},[5295,15350,5351],{"class":5331},[5295,15352,5354],{"class":5338},[5295,15354,5357],{"class":5331},[5295,15356,5427],{"class":5381},[5295,15358,5430],{"class":5338},[5295,15360,5433],{"class":5327},[5295,15362,5436],{"class":5338},[5295,15364,5439],{"class":5301},[5295,15366,5361],{"class":5360},[5295,15368,5444],{"class":5338},[5295,15370,15371,15373,15375,15377,15379,15381,15383,15385,15387,15389],{"class":5297,"line":5478},[5295,15372,7354],{"class":5327},[5295,15374,7357],{"class":5327},[5295,15376,5453],{"class":5327},[5295,15378,5456],{"class":5381},[5295,15380,5430],{"class":5338},[5295,15382,5433],{"class":5327},[5295,15384,6276],{"class":5338},[5295,15386,8488],{"class":5725},[5295,15388,6252],{"class":5338},[5295,15390,15391],{"class":5710},"  \u002F\u002F Чисто віртуальна функція (абстрактний клас)\n",[5295,15393,15394],{"class":5297,"line":5483},[5295,15395,5475],{"class":5338},[5295,15397,15398],{"class":5297,"line":5499},[5295,15399,5321],{"emptyLinePlaceholder":5320},[5295,15401,15402,15404,15406,15408,15410],{"class":5297,"line":5504},[5295,15403,5328],{"class":5327},[5295,15405,6704],{"class":5331},[5295,15407,5491],{"class":5338},[5295,15409,5494],{"class":5327},[5295,15411,5332],{"class":5331},[5295,15413,15414],{"class":5297,"line":5509},[5295,15415,5339],{"class":5338},[5295,15417,15418],{"class":5297,"line":5535},[5295,15419,5375],{"class":5327},[5295,15421,15422,15424,15426,15428,15430,15432,15434,15436,15438,15440,15442],{"class":5297,"line":5540},[5295,15423,6812],{"class":5381},[5295,15425,5385],{"class":5338},[5295,15427,5388],{"class":5331},[5295,15429,5354],{"class":5338},[5295,15431,5357],{"class":5331},[5295,15433,5395],{"class":5360},[5295,15435,5398],{"class":5338},[5295,15437,5263],{"class":5381},[5295,15439,5385],{"class":5338},[5295,15441,5406],{"class":5360},[5295,15443,5409],{"class":5338},[5295,15445,15446,15448,15450,15452,15454,15456,15458,15460,15462,15464],{"class":5297,"line":5562},[5295,15447,5450],{"class":5327},[5295,15449,5453],{"class":5327},[5295,15451,5456],{"class":5381},[5295,15453,5430],{"class":5338},[5295,15455,5433],{"class":5327},[5295,15457,14751],{"class":5327},[5295,15459,5436],{"class":5338},[5295,15461,5439],{"class":5301},[5295,15463,6737],{"class":5305},[5295,15465,5444],{"class":5338},[5295,15467,15468],{"class":5297,"line":5567},[5295,15469,5475],{"class":5338},[5295,15471,15472],{"class":5297,"line":5572},[5295,15473,5321],{"emptyLinePlaceholder":5320},[5295,15475,15476,15478,15480,15482,15484],{"class":5297,"line":5597},[5295,15477,5328],{"class":5327},[5295,15479,5488],{"class":5331},[5295,15481,5491],{"class":5338},[5295,15483,5494],{"class":5327},[5295,15485,5332],{"class":5331},[5295,15487,15488],{"class":5297,"line":5602},[5295,15489,5339],{"class":5338},[5295,15491,15492],{"class":5297,"line":5652},[5295,15493,5375],{"class":5327},[5295,15495,15496,15498,15500,15502,15504,15506,15508,15510,15512,15514,15516],{"class":5297,"line":5658},[5295,15497,5512],{"class":5381},[5295,15499,5385],{"class":5338},[5295,15501,5388],{"class":5331},[5295,15503,5354],{"class":5338},[5295,15505,5357],{"class":5331},[5295,15507,5395],{"class":5360},[5295,15509,5398],{"class":5338},[5295,15511,5263],{"class":5381},[5295,15513,5385],{"class":5338},[5295,15515,5406],{"class":5360},[5295,15517,5409],{"class":5338},[5295,15519,15520,15522,15524,15526,15528,15530,15532,15534,15536,15538],{"class":5297,"line":5663},[5295,15521,5450],{"class":5327},[5295,15523,5453],{"class":5327},[5295,15525,5456],{"class":5381},[5295,15527,5430],{"class":5338},[5295,15529,5433],{"class":5327},[5295,15531,14751],{"class":5327},[5295,15533,5436],{"class":5338},[5295,15535,5439],{"class":5301},[5295,15537,5557],{"class":5305},[5295,15539,5444],{"class":5338},[5295,15541,15542],{"class":5297,"line":5675},[5295,15543,5475],{"class":5338},[5295,15545,15546],{"class":5297,"line":5680},[5295,15547,5321],{"emptyLinePlaceholder":5320},[5295,15549,15550,15552,15554,15556,15558],{"class":5297,"line":5696},[5295,15551,5328],{"class":5327},[5295,15553,8281],{"class":5331},[5295,15555,5491],{"class":5338},[5295,15557,5494],{"class":5327},[5295,15559,5332],{"class":5331},[5295,15561,15562],{"class":5297,"line":5714},[5295,15563,5339],{"class":5338},[5295,15565,15566],{"class":5297,"line":5719},[5295,15567,5375],{"class":5327},[5295,15569,15570,15572,15574,15576,15578,15580,15582,15584,15586,15588,15590],{"class":5297,"line":5731},[5295,15571,8047],{"class":5381},[5295,15573,5385],{"class":5338},[5295,15575,5388],{"class":5331},[5295,15577,5354],{"class":5338},[5295,15579,5357],{"class":5331},[5295,15581,5395],{"class":5360},[5295,15583,5398],{"class":5338},[5295,15585,5263],{"class":5381},[5295,15587,5385],{"class":5338},[5295,15589,5406],{"class":5360},[5295,15591,5409],{"class":5338},[5295,15593,15594,15596,15598,15600,15602,15604,15606,15608,15610,15612],{"class":5297,"line":6354},[5295,15595,5450],{"class":5327},[5295,15597,5453],{"class":5327},[5295,15599,5456],{"class":5381},[5295,15601,5430],{"class":5338},[5295,15603,5433],{"class":5327},[5295,15605,14751],{"class":5327},[5295,15607,5436],{"class":5338},[5295,15609,5439],{"class":5301},[5295,15611,8983],{"class":5305},[5295,15613,5444],{"class":5338},[5295,15615,15616],{"class":5297,"line":6387},[5295,15617,5475],{"class":5338},[5295,15619,15620],{"class":5297,"line":6392},[5295,15621,5321],{"emptyLinePlaceholder":5320},[5295,15623,15624],{"class":5297,"line":6401},[5295,15625,15626],{"class":5710},"\u002F\u002F Фабричний метод: створює тварину на основі типу\n",[5295,15628,15629,15631,15633,15636,15638,15640,15643,15646,15648,15650,15652,15654,15656,15658,15661,15663,15665,15667,15669,15671,15673,15675],{"class":5297,"line":9032},[5295,15630,5388],{"class":5331},[5295,15632,5354],{"class":5338},[5295,15634,15635],{"class":5331},"unique_ptr",[5295,15637,10200],{"class":5338},[5295,15639,5263],{"class":5331},[5295,15641,15642],{"class":5338},"> ",[5295,15644,15645],{"class":5381},"createAnimal",[5295,15647,5385],{"class":5338},[5295,15649,5433],{"class":5327},[5295,15651,15088],{"class":5331},[5295,15653,5354],{"class":5338},[5295,15655,5357],{"class":5331},[5295,15657,5588],{"class":5327},[5295,15659,15660],{"class":5360}," type",[5295,15662,7913],{"class":5338},[5295,15664,5433],{"class":5327},[5295,15666,15088],{"class":5331},[5295,15668,5354],{"class":5338},[5295,15670,5357],{"class":5331},[5295,15672,5588],{"class":5327},[5295,15674,5361],{"class":5360},[5295,15676,5594],{"class":5338},[5295,15678,15679],{"class":5297,"line":9045},[5295,15680,5339],{"class":5338},[5295,15682,15683,15686,15688,15691,15694,15697],{"class":5297,"line":9059},[5295,15684,15685],{"class":5301},"    if",[5295,15687,5805],{"class":5338},[5295,15689,15690],{"class":5360},"type",[5295,15692,15693],{"class":5338}," == ",[5295,15695,15696],{"class":5305},"\"cat\"",[5295,15698,14050],{"class":5338},[5295,15700,15701,15703,15705,15707,15710,15712,15714,15717,15719],{"class":5297,"line":9073},[5295,15702,10064],{"class":5301},[5295,15704,15088],{"class":5331},[5295,15706,5354],{"class":5338},[5295,15708,15709],{"class":5381},"make_unique",[5295,15711,10200],{"class":5338},[5295,15713,5267],{"class":5331},[5295,15715,15716],{"class":5338},">(",[5295,15718,5401],{"class":5360},[5295,15720,5693],{"class":5338},[5295,15722,15723,15726,15729,15732,15734,15736,15738,15741],{"class":5297,"line":9078},[5295,15724,15725],{"class":5338},"    } ",[5295,15727,15728],{"class":5301},"else",[5295,15730,15731],{"class":5301}," if",[5295,15733,5805],{"class":5338},[5295,15735,15690],{"class":5360},[5295,15737,15693],{"class":5338},[5295,15739,15740],{"class":5305},"\"dog\"",[5295,15742,14050],{"class":5338},[5295,15744,15745,15747,15749,15751,15753,15755,15757,15759,15761],{"class":5297,"line":9084},[5295,15746,10064],{"class":5301},[5295,15748,15088],{"class":5331},[5295,15750,5354],{"class":5338},[5295,15752,15709],{"class":5381},[5295,15754,10200],{"class":5338},[5295,15756,5271],{"class":5331},[5295,15758,15716],{"class":5338},[5295,15760,5401],{"class":5360},[5295,15762,5693],{"class":5338},[5295,15764,15765,15767,15769,15771,15773,15775,15777,15780],{"class":5297,"line":9121},[5295,15766,15725],{"class":5338},[5295,15768,15728],{"class":5301},[5295,15770,15731],{"class":5301},[5295,15772,5805],{"class":5338},[5295,15774,15690],{"class":5360},[5295,15776,15693],{"class":5338},[5295,15778,15779],{"class":5305},"\"bird\"",[5295,15781,14050],{"class":5338},[5295,15783,15784,15786,15788,15790,15792,15794,15796,15798,15800],{"class":5297,"line":9126},[5295,15785,10064],{"class":5301},[5295,15787,15088],{"class":5331},[5295,15789,5354],{"class":5338},[5295,15791,15709],{"class":5381},[5295,15793,10200],{"class":5338},[5295,15795,7919],{"class":5331},[5295,15797,15716],{"class":5338},[5295,15799,5401],{"class":5360},[5295,15801,5693],{"class":5338},[5295,15803,15804,15806,15808],{"class":5297,"line":9146},[5295,15805,15725],{"class":5338},[5295,15807,15728],{"class":5301},[5295,15809,11544],{"class":5338},[5295,15811,15812,15814,15817],{"class":5297,"line":9176},[5295,15813,10064],{"class":5301},[5295,15815,15816],{"class":5327}," nullptr",[5295,15818,5364],{"class":5338},[5295,15820,15821],{"class":5297,"line":9207},[5295,15822,8546],{"class":5338},[5295,15824,15825],{"class":5297,"line":9237},[5295,15826,5655],{"class":5338},[5295,15828,15829],{"class":5297,"line":9242},[5295,15830,5321],{"emptyLinePlaceholder":5320},[5295,15832,15833,15835,15837],{"class":5297,"line":9247},[5295,15834,5666],{"class":5327},[5295,15836,5669],{"class":5381},[5295,15838,5672],{"class":5338},[5295,15840,15841],{"class":5297,"line":9256},[5295,15842,5339],{"class":5338},[5295,15844,15845],{"class":5297,"line":13229},[5295,15846,15847],{"class":5710},"    \u002F\u002F Імітація введення користувача або конфігураційного файлу\n",[5295,15849,15850,15852,15854,15856,15859,15861,15863,15865,15867,15869,15871,15873,15875],{"class":5297,"line":13243},[5295,15851,5351],{"class":5331},[5295,15853,5354],{"class":5338},[5295,15855,5357],{"class":5331},[5295,15857,15858],{"class":5360}," types",[5295,15860,8404],{"class":5338},[5295,15862,15696],{"class":5305},[5295,15864,7913],{"class":5338},[5295,15866,15740],{"class":5305},[5295,15868,7913],{"class":5338},[5295,15870,15779],{"class":5305},[5295,15872,7913],{"class":5338},[5295,15874,15696],{"class":5305},[5295,15876,9118],{"class":5338},[5295,15878,15879,15881,15883,15885,15888,15890,15892,15894,15896,15898,15900,15902,15904],{"class":5297,"line":13248},[5295,15880,5351],{"class":5331},[5295,15882,5354],{"class":5338},[5295,15884,5357],{"class":5331},[5295,15886,15887],{"class":5360}," names",[5295,15889,8404],{"class":5338},[5295,15891,6820],{"class":5305},[5295,15893,7913],{"class":5338},[5295,15895,6833],{"class":5305},[5295,15897,7913],{"class":5338},[5295,15899,8055],{"class":5305},[5295,15901,7913],{"class":5338},[5295,15903,8420],{"class":5305},[5295,15905,9118],{"class":5338},[5295,15907,15908],{"class":5297,"line":13253},[5295,15909,5415],{"class":5338},[5295,15911,15912,15914,15916,15918,15920,15922,15924,15926,15928,15930,15933,15936],{"class":5297,"line":13285},[5295,15913,5351],{"class":5331},[5295,15915,5354],{"class":5338},[5295,15917,13977],{"class":5331},[5295,15919,10200],{"class":5338},[5295,15921,5388],{"class":5331},[5295,15923,5354],{"class":5338},[5295,15925,15635],{"class":5331},[5295,15927,10200],{"class":5338},[5295,15929,5263],{"class":5331},[5295,15931,15932],{"class":5338},">> ",[5295,15934,15935],{"class":5360},"zoo",[5295,15937,5364],{"class":5338},[5295,15939,15940],{"class":5297,"line":13320},[5295,15941,5415],{"class":5338},[5295,15943,15944,15946,15948,15950,15952,15954,15956,15958,15960,15962,15965,15967,15969],{"class":5297,"line":13325},[5295,15945,8476],{"class":5301},[5295,15947,5805],{"class":5338},[5295,15949,5666],{"class":5327},[5295,15951,8483],{"class":5360},[5295,15953,6276],{"class":5338},[5295,15955,8488],{"class":5725},[5295,15957,8491],{"class":5338},[5295,15959,8494],{"class":5360},[5295,15961,8497],{"class":5338},[5295,15963,15964],{"class":5725},"4",[5295,15966,8491],{"class":5338},[5295,15968,8494],{"class":5360},[5295,15970,8507],{"class":5338},[5295,15972,15973,15976,15978,15980,15982,15984,15987,15989,15991,15994,15997,15999,16001],{"class":5297,"line":13336},[5295,15974,15975],{"class":5327},"        auto",[5295,15977,5591],{"class":5360},[5295,15979,6276],{"class":5338},[5295,15981,15645],{"class":5381},[5295,15983,5385],{"class":5338},[5295,15985,15986],{"class":5360},"types",[5295,15988,8524],{"class":5338},[5295,15990,8494],{"class":5360},[5295,15992,15993],{"class":5338},"], ",[5295,15995,15996],{"class":5360},"names",[5295,15998,8524],{"class":5338},[5295,16000,8494],{"class":5360},[5295,16002,16003],{"class":5338},"]);\n",[5295,16005,16006,16009,16011,16013],{"class":5297,"line":13341},[5295,16007,16008],{"class":5301},"        if",[5295,16010,5805],{"class":5338},[5295,16012,5615],{"class":5360},[5295,16014,14050],{"class":5338},[5295,16016,16017,16020,16022,16025,16027,16029,16031,16033,16035,16037],{"class":5297,"line":13361},[5295,16018,16019],{"class":5360},"            zoo",[5295,16021,5618],{"class":5338},[5295,16023,16024],{"class":5381},"push_back",[5295,16026,5385],{"class":5338},[5295,16028,5388],{"class":5331},[5295,16030,5354],{"class":5338},[5295,16032,11709],{"class":5381},[5295,16034,5385],{"class":5338},[5295,16036,5615],{"class":5360},[5295,16038,16039],{"class":5338},"));\n",[5295,16041,16042],{"class":5297,"line":13366},[5295,16043,16044],{"class":5338},"        }\n",[5295,16046,16047],{"class":5297,"line":13371},[5295,16048,8546],{"class":5338},[5295,16050,16051],{"class":5297,"line":13389},[5295,16052,5415],{"class":5338},[5295,16054,16055,16057,16059,16061,16063,16066,16068,16070],{"class":5297,"line":13394},[5295,16056,5351],{"class":5331},[5295,16058,5354],{"class":5338},[5295,16060,5609],{"class":5360},[5295,16062,5612],{"class":5338},[5295,16064,16065],{"class":5305},"\"Тварини в зоопарку:",[5295,16067,5645],{"class":5644},[5295,16069,5641],{"class":5305},[5295,16071,5364],{"class":5338},[5295,16073,16074,16076,16078,16080,16083,16085,16087,16089],{"class":5297,"line":13407},[5295,16075,8476],{"class":5301},[5295,16077,5805],{"class":5338},[5295,16079,5433],{"class":5327},[5295,16081,16082],{"class":5327}," auto&",[5295,16084,5591],{"class":5360},[5295,16086,5491],{"class":5338},[5295,16088,15935],{"class":5360},[5295,16090,14050],{"class":5338},[5295,16092,16093,16095,16097,16099,16101,16103,16105,16107,16109,16111],{"class":5297,"line":13428},[5295,16094,8512],{"class":5331},[5295,16096,5354],{"class":5338},[5295,16098,5609],{"class":5360},[5295,16100,5612],{"class":5338},[5295,16102,9187],{"class":5305},[5295,16104,5612],{"class":5338},[5295,16106,5615],{"class":5360},[5295,16108,6339],{"class":5338},[5295,16110,5621],{"class":5381},[5295,16112,9204],{"class":5338},[5295,16114,16115,16117,16119,16121,16123,16125,16127,16129,16131,16133,16135],{"class":5297,"line":13450},[5295,16116,9210],{"class":5338},[5295,16118,5627],{"class":5305},[5295,16120,5612],{"class":5338},[5295,16122,5615],{"class":5360},[5295,16124,6339],{"class":5338},[5295,16126,5636],{"class":5381},[5295,16128,5624],{"class":5338},[5295,16130,5641],{"class":5305},[5295,16132,5645],{"class":5644},[5295,16134,5641],{"class":5305},[5295,16136,5364],{"class":5338},[5295,16138,16139],{"class":5297,"line":13455},[5295,16140,8546],{"class":5338},[5295,16142,16143],{"class":5297,"line":13460},[5295,16144,5415],{"class":5338},[5295,16146,16147,16149,16151],{"class":5297,"line":13473},[5295,16148,5722],{"class":5301},[5295,16150,5726],{"class":5725},[5295,16152,5364],{"class":5338},[5295,16154,16155],{"class":5297,"line":13478},[5295,16156,5655],{"class":5338},[5761,16158,16160,16164,16167,16170,16173],{"title":16159},".\u002FFactoryMethod",[5765,16161,16163],{"className":16162},[5297],"Тварини в зоопарку:",[5765,16165,9269],{"className":16166},[5297],[5765,16168,9273],{"className":16169},[5297],[5765,16171,9277],{"className":16172},[5297],[5765,16174,9281],{"className":16175},[5297],[5257,16177,16178,16179,5792,16182,16185,16186,8129,16188,5805,16191,16194,16195,16197,16198,7913,16200,5824],{},"У цьому прикладі функція ",[5261,16180,16181],{},"createAnimal()",[5742,16183,16184],{},"інкапсулює логіку створення об'єктів",". Код, що викликає цю функцію, не знає і не повинен знати, який конкретно клас буде створено — йому достатньо отримати покажчик на ",[5261,16187,5263],{},[5742,16189,16190],{},"принцип інверсії залежностей",[5807,16192,16193],{},"Dependency Inversion Principle","): високорівневий код (головний цикл) залежить від абстракції (",[5261,16196,5263],{},"), а не від конкретних реалізацій (",[5261,16199,5267],{},[5261,16201,5271],{},[6448,16203,16204,16205,16208,16209,7318,16211,5805,16214,13384,16217,16220],{},"У цьому прикладі ми використали ",[5261,16206,16207],{},"std::unique_ptr\u003CAnimal>"," замість сирого покажчика ",[5261,16210,6467],{},[5742,16212,16213],{},"Розумний покажчик",[5807,16215,16216],{},"smart pointer",[5261,16218,16219],{},"std::unique_ptr"," автоматично звільняє пам'ять при виході зі scope, запобігаючи витокам пам'яті. Це стандартна практика сучасного C++ (C++11 і новіше). Розумні покажчики ми детально вивчимо в одній із майбутніх статей.",[5929,16222,16224],{"id":16223},"стратегія-інкапсуляція-алгоритмів","Стратегія: інкапсуляція алгоритмів",[5257,16226,16227,16228,5805,16231,16234],{},"Поліморфізм дозволяє реалізувати патерн ",[5742,16229,16230],{},"Стратегія",[5807,16232,16233],{},"Strategy",") — можливість динамічно змінювати поведінку об'єкта шляхом заміни його внутрішнього алгоритму. Розглянемо приклад системи сортування:",[5285,16236,16239],{"className":5287,"code":16237,"filename":16238,"language":5290,"meta":5291,"style":5291},"#include \u003Ciostream>\n#include \u003Cvector>\n#include \u003Calgorithm>\n\n\u002F\u002F Абстрактна стратегія сортування\nclass SortStrategy\n{\npublic:\n    virtual ~SortStrategy() {}\n    virtual void sort(std::vector\u003Cint>& data) const = 0;\n    virtual const char* getName() const = 0;\n};\n\n\u002F\u002F Конкретна стратегія: бульбашкове сортування\nclass BubbleSort : public SortStrategy\n{\npublic:\n    void sort(std::vector\u003Cint>& data) const override\n    {\n        for (size_t i = 0; i \u003C data.size(); i++) {\n            for (size_t j = 0; j \u003C data.size() - 1 - i; j++) {\n                if (data[j] > data[j + 1]) {\n                    std::swap(data[j], data[j + 1]);\n                }\n            }\n        }\n    }\n    \n    const char* getName() const override { return \"Bubble Sort\"; }\n};\n\n\u002F\u002F Конкретна стратегія: швидке сортування\nclass QuickSort : public SortStrategy\n{\npublic:\n    void sort(std::vector\u003Cint>& data) const override\n    {\n        std::sort(data.begin(), data.end());\n    }\n    \n    const char* getName() const override { return \"Quick Sort\"; }\n};\n\n\u002F\u002F Контекст: клас, що використовує стратегію\nclass DataProcessor\n{\nprivate:\n    SortStrategy* strategy;\n\npublic:\n    DataProcessor(SortStrategy* s) : strategy(s) {}\n    \n    void setStrategy(SortStrategy* s) { strategy = s; }\n    \n    void processData(std::vector\u003Cint>& data) const\n    {\n        std::cout \u003C\u003C \"Використовую стратегію: \" \u003C\u003C strategy->getName() \u003C\u003C \"\\n\";\n        strategy->sort(data);\n        \n        std::cout \u003C\u003C \"Відсортовані дані: \";\n        for (int val : data) {\n            std::cout \u003C\u003C val \u003C\u003C \" \";\n        }\n        std::cout \u003C\u003C \"\\n\\n\";\n    }\n};\n\nint main()\n{\n    std::vector\u003Cint> data1 = { 5, 2, 9, 1, 5, 6 };\n    std::vector\u003Cint> data2 = { 8, 3, 7, 4, 2 };\n    \n    BubbleSort bubbleStrategy;\n    QuickSort quickStrategy;\n    \n    DataProcessor processor(&bubbleStrategy);\n    processor.processData(data1);\n    \n    \u002F\u002F Динамічна зміна стратегії\n    processor.setStrategy(&quickStrategy);\n    processor.processData(data2);\n    \n    return 0;\n}\n","Strategy.cpp",[5261,16240,16241,16247,16253,16260,16264,16269,16276,16280,16284,16293,16332,16352,16356,16360,16365,16378,16382,16386,16416,16420,16457,16503,16532,16564,16569,16574,16578,16582,16586,16609,16613,16617,16622,16635,16639,16643,16673,16677,16708,16712,16716,16739,16743,16747,16752,16759,16763,16767,16779,16783,16787,16814,16818,16844,16848,16877,16881,16912,16927,16932,16947,16964,16985,16989,17007,17011,17015,17019,17027,17031,17078,17119,17123,17133,17143,17147,17162,17178,17182,17187,17203,17217,17221,17229],{"__ignoreMap":5291},[5295,16242,16243,16245],{"class":5297,"line":5298},[5295,16244,5302],{"class":5301},[5295,16246,5306],{"class":5305},[5295,16248,16249,16251],{"class":5297,"line":5309},[5295,16250,5302],{"class":5301},[5295,16252,12672],{"class":5305},[5295,16254,16255,16257],{"class":5297,"line":5317},[5295,16256,5302],{"class":5301},[5295,16258,16259],{"class":5305}," \u003Calgorithm>\n",[5295,16261,16262],{"class":5297,"line":5324},[5295,16263,5321],{"emptyLinePlaceholder":5320},[5295,16265,16266],{"class":5297,"line":5335},[5295,16267,16268],{"class":5710},"\u002F\u002F Абстрактна стратегія сортування\n",[5295,16270,16271,16273],{"class":5297,"line":5342},[5295,16272,5328],{"class":5327},[5295,16274,16275],{"class":5331}," SortStrategy\n",[5295,16277,16278],{"class":5297,"line":5348},[5295,16279,5339],{"class":5338},[5295,16281,16282],{"class":5297,"line":5367},[5295,16283,5375],{"class":5327},[5295,16285,16286,16288,16291],{"class":5297,"line":5372},[5295,16287,7354],{"class":5327},[5295,16289,16290],{"class":5381}," ~SortStrategy",[5295,16292,12820],{"class":5338},[5295,16294,16295,16297,16299,16302,16304,16306,16308,16310,16312,16314,16317,16319,16322,16324,16326,16328,16330],{"class":5297,"line":5378},[5295,16296,7354],{"class":5327},[5295,16298,9666],{"class":5327},[5295,16300,16301],{"class":5381}," sort",[5295,16303,5385],{"class":5338},[5295,16305,5388],{"class":5331},[5295,16307,5354],{"class":5338},[5295,16309,13977],{"class":5331},[5295,16311,10200],{"class":5338},[5295,16313,5666],{"class":5327},[5295,16315,16316],{"class":5338},">",[5295,16318,5588],{"class":5327},[5295,16320,16321],{"class":5360}," data",[5295,16323,13384],{"class":5338},[5295,16325,5433],{"class":5327},[5295,16327,6276],{"class":5338},[5295,16329,8488],{"class":5725},[5295,16331,5364],{"class":5338},[5295,16333,16334,16336,16338,16340,16342,16344,16346,16348,16350],{"class":5297,"line":5412},[5295,16335,7354],{"class":5327},[5295,16337,7357],{"class":5327},[5295,16339,5453],{"class":5327},[5295,16341,5427],{"class":5381},[5295,16343,5430],{"class":5338},[5295,16345,5433],{"class":5327},[5295,16347,6276],{"class":5338},[5295,16349,8488],{"class":5725},[5295,16351,5364],{"class":5338},[5295,16353,16354],{"class":5297,"line":5418},[5295,16355,5475],{"class":5338},[5295,16357,16358],{"class":5297,"line":5447},[5295,16359,5321],{"emptyLinePlaceholder":5320},[5295,16361,16362],{"class":5297,"line":5472},[5295,16363,16364],{"class":5710},"\u002F\u002F Конкретна стратегія: бульбашкове сортування\n",[5295,16366,16367,16369,16372,16374,16376],{"class":5297,"line":5478},[5295,16368,5328],{"class":5327},[5295,16370,16371],{"class":5331}," BubbleSort",[5295,16373,5491],{"class":5338},[5295,16375,5494],{"class":5327},[5295,16377,16275],{"class":5331},[5295,16379,16380],{"class":5297,"line":5483},[5295,16381,5339],{"class":5338},[5295,16383,16384],{"class":5297,"line":5499},[5295,16385,5375],{"class":5327},[5295,16387,16388,16390,16392,16394,16396,16398,16400,16402,16404,16406,16408,16410,16412,16414],{"class":5297,"line":5504},[5295,16389,6170],{"class":5327},[5295,16391,16301],{"class":5381},[5295,16393,5385],{"class":5338},[5295,16395,5388],{"class":5331},[5295,16397,5354],{"class":5338},[5295,16399,13977],{"class":5331},[5295,16401,10200],{"class":5338},[5295,16403,5666],{"class":5327},[5295,16405,16316],{"class":5338},[5295,16407,5588],{"class":5327},[5295,16409,16321],{"class":5360},[5295,16411,13384],{"class":5338},[5295,16413,5433],{"class":5327},[5295,16415,10340],{"class":5327},[5295,16417,16418],{"class":5297,"line":5509},[5295,16419,10059],{"class":5338},[5295,16421,16422,16425,16427,16430,16432,16434,16436,16438,16440,16442,16445,16447,16450,16453,16455],{"class":5297,"line":5535},[5295,16423,16424],{"class":5301},"        for",[5295,16426,5805],{"class":5338},[5295,16428,16429],{"class":5327},"size_t",[5295,16431,8483],{"class":5360},[5295,16433,6276],{"class":5338},[5295,16435,8488],{"class":5725},[5295,16437,8491],{"class":5338},[5295,16439,8494],{"class":5360},[5295,16441,8497],{"class":5338},[5295,16443,16444],{"class":5360},"data",[5295,16446,5618],{"class":5338},[5295,16448,16449],{"class":5381},"size",[5295,16451,16452],{"class":5338},"(); ",[5295,16454,8494],{"class":5360},[5295,16456,8507],{"class":5338},[5295,16458,16459,16462,16464,16466,16469,16471,16473,16475,16478,16480,16482,16484,16486,16489,16492,16495,16497,16499,16501],{"class":5297,"line":5540},[5295,16460,16461],{"class":5301},"            for",[5295,16463,5805],{"class":5338},[5295,16465,16429],{"class":5327},[5295,16467,16468],{"class":5360}," j",[5295,16470,6276],{"class":5338},[5295,16472,8488],{"class":5725},[5295,16474,8491],{"class":5338},[5295,16476,16477],{"class":5360},"j",[5295,16479,8497],{"class":5338},[5295,16481,16444],{"class":5360},[5295,16483,5618],{"class":5338},[5295,16485,16449],{"class":5381},[5295,16487,16488],{"class":5338},"() - ",[5295,16490,16491],{"class":5725},"1",[5295,16493,16494],{"class":5338}," - ",[5295,16496,8494],{"class":5360},[5295,16498,8491],{"class":5338},[5295,16500,16477],{"class":5360},[5295,16502,8507],{"class":5338},[5295,16504,16505,16508,16510,16512,16514,16516,16519,16521,16523,16525,16527,16529],{"class":5297,"line":5562},[5295,16506,16507],{"class":5301},"                if",[5295,16509,5805],{"class":5338},[5295,16511,16444],{"class":5360},[5295,16513,8524],{"class":5338},[5295,16515,16477],{"class":5360},[5295,16517,16518],{"class":5338},"] > ",[5295,16520,16444],{"class":5360},[5295,16522,8524],{"class":5338},[5295,16524,16477],{"class":5360},[5295,16526,13716],{"class":5338},[5295,16528,16491],{"class":5725},[5295,16530,16531],{"class":5338},"]) {\n",[5295,16533,16534,16537,16539,16542,16544,16546,16548,16550,16552,16554,16556,16558,16560,16562],{"class":5297,"line":5567},[5295,16535,16536],{"class":5331},"                    std",[5295,16538,5354],{"class":5338},[5295,16540,16541],{"class":5381},"swap",[5295,16543,5385],{"class":5338},[5295,16545,16444],{"class":5360},[5295,16547,8524],{"class":5338},[5295,16549,16477],{"class":5360},[5295,16551,15993],{"class":5338},[5295,16553,16444],{"class":5360},[5295,16555,8524],{"class":5338},[5295,16557,16477],{"class":5360},[5295,16559,13716],{"class":5338},[5295,16561,16491],{"class":5725},[5295,16563,16003],{"class":5338},[5295,16565,16566],{"class":5297,"line":5572},[5295,16567,16568],{"class":5338},"                }\n",[5295,16570,16571],{"class":5297,"line":5597},[5295,16572,16573],{"class":5338},"            }\n",[5295,16575,16576],{"class":5297,"line":5602},[5295,16577,16044],{"class":5338},[5295,16579,16580],{"class":5297,"line":5652},[5295,16581,8546],{"class":5338},[5295,16583,16584],{"class":5297,"line":5658},[5295,16585,5415],{"class":5338},[5295,16587,16588,16590,16592,16594,16596,16598,16600,16602,16604,16607],{"class":5297,"line":5663},[5295,16589,5450],{"class":5327},[5295,16591,5453],{"class":5327},[5295,16593,5427],{"class":5381},[5295,16595,5430],{"class":5338},[5295,16597,5433],{"class":5327},[5295,16599,14751],{"class":5327},[5295,16601,5436],{"class":5338},[5295,16603,5439],{"class":5301},[5295,16605,16606],{"class":5305}," \"Bubble Sort\"",[5295,16608,5444],{"class":5338},[5295,16610,16611],{"class":5297,"line":5675},[5295,16612,5475],{"class":5338},[5295,16614,16615],{"class":5297,"line":5680},[5295,16616,5321],{"emptyLinePlaceholder":5320},[5295,16618,16619],{"class":5297,"line":5696},[5295,16620,16621],{"class":5710},"\u002F\u002F Конкретна стратегія: швидке сортування\n",[5295,16623,16624,16626,16629,16631,16633],{"class":5297,"line":5714},[5295,16625,5328],{"class":5327},[5295,16627,16628],{"class":5331}," QuickSort",[5295,16630,5491],{"class":5338},[5295,16632,5494],{"class":5327},[5295,16634,16275],{"class":5331},[5295,16636,16637],{"class":5297,"line":5719},[5295,16638,5339],{"class":5338},[5295,16640,16641],{"class":5297,"line":5731},[5295,16642,5375],{"class":5327},[5295,16644,16645,16647,16649,16651,16653,16655,16657,16659,16661,16663,16665,16667,16669,16671],{"class":5297,"line":6354},[5295,16646,6170],{"class":5327},[5295,16648,16301],{"class":5381},[5295,16650,5385],{"class":5338},[5295,16652,5388],{"class":5331},[5295,16654,5354],{"class":5338},[5295,16656,13977],{"class":5331},[5295,16658,10200],{"class":5338},[5295,16660,5666],{"class":5327},[5295,16662,16316],{"class":5338},[5295,16664,5588],{"class":5327},[5295,16666,16321],{"class":5360},[5295,16668,13384],{"class":5338},[5295,16670,5433],{"class":5327},[5295,16672,10340],{"class":5327},[5295,16674,16675],{"class":5297,"line":6387},[5295,16676,10059],{"class":5338},[5295,16678,16679,16681,16683,16686,16688,16690,16692,16695,16698,16700,16702,16705],{"class":5297,"line":6392},[5295,16680,8512],{"class":5331},[5295,16682,5354],{"class":5338},[5295,16684,16685],{"class":5381},"sort",[5295,16687,5385],{"class":5338},[5295,16689,16444],{"class":5360},[5295,16691,5618],{"class":5338},[5295,16693,16694],{"class":5381},"begin",[5295,16696,16697],{"class":5338},"(), ",[5295,16699,16444],{"class":5360},[5295,16701,5618],{"class":5338},[5295,16703,16704],{"class":5381},"end",[5295,16706,16707],{"class":5338},"());\n",[5295,16709,16710],{"class":5297,"line":6401},[5295,16711,8546],{"class":5338},[5295,16713,16714],{"class":5297,"line":9032},[5295,16715,5415],{"class":5338},[5295,16717,16718,16720,16722,16724,16726,16728,16730,16732,16734,16737],{"class":5297,"line":9045},[5295,16719,5450],{"class":5327},[5295,16721,5453],{"class":5327},[5295,16723,5427],{"class":5381},[5295,16725,5430],{"class":5338},[5295,16727,5433],{"class":5327},[5295,16729,14751],{"class":5327},[5295,16731,5436],{"class":5338},[5295,16733,5439],{"class":5301},[5295,16735,16736],{"class":5305}," \"Quick Sort\"",[5295,16738,5444],{"class":5338},[5295,16740,16741],{"class":5297,"line":9059},[5295,16742,5475],{"class":5338},[5295,16744,16745],{"class":5297,"line":9073},[5295,16746,5321],{"emptyLinePlaceholder":5320},[5295,16748,16749],{"class":5297,"line":9078},[5295,16750,16751],{"class":5710},"\u002F\u002F Контекст: клас, що використовує стратегію\n",[5295,16753,16754,16756],{"class":5297,"line":9084},[5295,16755,5328],{"class":5327},[5295,16757,16758],{"class":5331}," DataProcessor\n",[5295,16760,16761],{"class":5297,"line":9121},[5295,16762,5339],{"class":5338},[5295,16764,16765],{"class":5297,"line":9126},[5295,16766,12995],{"class":5327},[5295,16768,16769,16772,16774,16777],{"class":5297,"line":9146},[5295,16770,16771],{"class":5331},"    SortStrategy",[5295,16773,6241],{"class":5327},[5295,16775,16776],{"class":5360}," strategy",[5295,16778,5364],{"class":5338},[5295,16780,16781],{"class":5297,"line":9176},[5295,16782,5321],{"emptyLinePlaceholder":5320},[5295,16784,16785],{"class":5297,"line":9207},[5295,16786,5375],{"class":5327},[5295,16788,16789,16792,16794,16797,16799,16802,16804,16807,16809,16812],{"class":5297,"line":9237},[5295,16790,16791],{"class":5381},"    DataProcessor",[5295,16793,5385],{"class":5338},[5295,16795,16796],{"class":5331},"SortStrategy",[5295,16798,6241],{"class":5327},[5295,16800,16801],{"class":5360}," s",[5295,16803,5398],{"class":5338},[5295,16805,16806],{"class":5381},"strategy",[5295,16808,5385],{"class":5338},[5295,16810,16811],{"class":5360},"s",[5295,16813,5409],{"class":5338},[5295,16815,16816],{"class":5297,"line":9242},[5295,16817,5415],{"class":5338},[5295,16819,16820,16822,16825,16827,16829,16831,16833,16836,16838,16840,16842],{"class":5297,"line":9247},[5295,16821,6170],{"class":5327},[5295,16823,16824],{"class":5381}," setStrategy",[5295,16826,5385],{"class":5338},[5295,16828,16796],{"class":5331},[5295,16830,6241],{"class":5327},[5295,16832,16801],{"class":5360},[5295,16834,16835],{"class":5338},") { ",[5295,16837,16806],{"class":5360},[5295,16839,6276],{"class":5338},[5295,16841,16811],{"class":5360},[5295,16843,5444],{"class":5338},[5295,16845,16846],{"class":5297,"line":9256},[5295,16847,5415],{"class":5338},[5295,16849,16850,16852,16855,16857,16859,16861,16863,16865,16867,16869,16871,16873,16875],{"class":5297,"line":13229},[5295,16851,6170],{"class":5327},[5295,16853,16854],{"class":5381}," processData",[5295,16856,5385],{"class":5338},[5295,16858,5388],{"class":5331},[5295,16860,5354],{"class":5338},[5295,16862,13977],{"class":5331},[5295,16864,10200],{"class":5338},[5295,16866,5666],{"class":5327},[5295,16868,16316],{"class":5338},[5295,16870,5588],{"class":5327},[5295,16872,16321],{"class":5360},[5295,16874,13384],{"class":5338},[5295,16876,10054],{"class":5327},[5295,16878,16879],{"class":5297,"line":13243},[5295,16880,10059],{"class":5338},[5295,16882,16883,16885,16887,16889,16891,16894,16896,16898,16900,16902,16904,16906,16908,16910],{"class":5297,"line":13248},[5295,16884,8512],{"class":5331},[5295,16886,5354],{"class":5338},[5295,16888,5609],{"class":5360},[5295,16890,5612],{"class":5338},[5295,16892,16893],{"class":5305},"\"Використовую стратегію: \"",[5295,16895,5612],{"class":5338},[5295,16897,16806],{"class":5360},[5295,16899,6339],{"class":5338},[5295,16901,5621],{"class":5381},[5295,16903,5624],{"class":5338},[5295,16905,5641],{"class":5305},[5295,16907,5645],{"class":5644},[5295,16909,5641],{"class":5305},[5295,16911,5364],{"class":5338},[5295,16913,16914,16917,16919,16921,16923,16925],{"class":5297,"line":13253},[5295,16915,16916],{"class":5360},"        strategy",[5295,16918,6339],{"class":5338},[5295,16920,16685],{"class":5381},[5295,16922,5385],{"class":5338},[5295,16924,16444],{"class":5360},[5295,16926,5693],{"class":5338},[5295,16928,16929],{"class":5297,"line":13285},[5295,16930,16931],{"class":5338},"        \n",[5295,16933,16934,16936,16938,16940,16942,16945],{"class":5297,"line":13320},[5295,16935,8512],{"class":5331},[5295,16937,5354],{"class":5338},[5295,16939,5609],{"class":5360},[5295,16941,5612],{"class":5338},[5295,16943,16944],{"class":5305},"\"Відсортовані дані: \"",[5295,16946,5364],{"class":5338},[5295,16948,16949,16951,16953,16955,16958,16960,16962],{"class":5297,"line":13325},[5295,16950,16424],{"class":5301},[5295,16952,5805],{"class":5338},[5295,16954,5666],{"class":5327},[5295,16956,16957],{"class":5360}," val",[5295,16959,5491],{"class":5338},[5295,16961,16444],{"class":5360},[5295,16963,14050],{"class":5338},[5295,16965,16966,16969,16971,16973,16975,16978,16980,16983],{"class":5297,"line":13336},[5295,16967,16968],{"class":5331},"            std",[5295,16970,5354],{"class":5338},[5295,16972,5609],{"class":5360},[5295,16974,5612],{"class":5338},[5295,16976,16977],{"class":5360},"val",[5295,16979,5612],{"class":5338},[5295,16981,16982],{"class":5305},"\" \"",[5295,16984,5364],{"class":5338},[5295,16986,16987],{"class":5297,"line":13341},[5295,16988,16044],{"class":5338},[5295,16990,16991,16993,16995,16997,16999,17001,17003,17005],{"class":5297,"line":13361},[5295,16992,8512],{"class":5331},[5295,16994,5354],{"class":5338},[5295,16996,5609],{"class":5360},[5295,16998,5612],{"class":5338},[5295,17000,5641],{"class":5305},[5295,17002,6918],{"class":5644},[5295,17004,5641],{"class":5305},[5295,17006,5364],{"class":5338},[5295,17008,17009],{"class":5297,"line":13366},[5295,17010,8546],{"class":5338},[5295,17012,17013],{"class":5297,"line":13371},[5295,17014,5475],{"class":5338},[5295,17016,17017],{"class":5297,"line":13389},[5295,17018,5321],{"emptyLinePlaceholder":5320},[5295,17020,17021,17023,17025],{"class":5297,"line":13394},[5295,17022,5666],{"class":5327},[5295,17024,5669],{"class":5381},[5295,17026,5672],{"class":5338},[5295,17028,17029],{"class":5297,"line":13407},[5295,17030,5339],{"class":5338},[5295,17032,17033,17035,17037,17039,17041,17043,17045,17048,17051,17053,17055,17058,17060,17063,17065,17067,17069,17071,17073,17076],{"class":5297,"line":13428},[5295,17034,5351],{"class":5331},[5295,17036,5354],{"class":5338},[5295,17038,13977],{"class":5331},[5295,17040,10200],{"class":5338},[5295,17042,5666],{"class":5327},[5295,17044,15642],{"class":5338},[5295,17046,17047],{"class":5360},"data1",[5295,17049,17050],{"class":5338}," = { ",[5295,17052,9167],{"class":5725},[5295,17054,7913],{"class":5338},[5295,17056,17057],{"class":5725},"2",[5295,17059,7913],{"class":5338},[5295,17061,17062],{"class":5725},"9",[5295,17064,7913],{"class":5338},[5295,17066,16491],{"class":5725},[5295,17068,7913],{"class":5338},[5295,17070,9167],{"class":5725},[5295,17072,7913],{"class":5338},[5295,17074,17075],{"class":5725},"6",[5295,17077,9118],{"class":5338},[5295,17079,17080,17082,17084,17086,17088,17090,17092,17095,17097,17100,17102,17104,17106,17109,17111,17113,17115,17117],{"class":5297,"line":13450},[5295,17081,5351],{"class":5331},[5295,17083,5354],{"class":5338},[5295,17085,13977],{"class":5331},[5295,17087,10200],{"class":5338},[5295,17089,5666],{"class":5327},[5295,17091,15642],{"class":5338},[5295,17093,17094],{"class":5360},"data2",[5295,17096,17050],{"class":5338},[5295,17098,17099],{"class":5725},"8",[5295,17101,7913],{"class":5338},[5295,17103,8500],{"class":5725},[5295,17105,7913],{"class":5338},[5295,17107,17108],{"class":5725},"7",[5295,17110,7913],{"class":5338},[5295,17112,15964],{"class":5725},[5295,17114,7913],{"class":5338},[5295,17116,17057],{"class":5725},[5295,17118,9118],{"class":5338},[5295,17120,17121],{"class":5297,"line":13455},[5295,17122,5415],{"class":5338},[5295,17124,17125,17128,17131],{"class":5297,"line":13460},[5295,17126,17127],{"class":5331},"    BubbleSort",[5295,17129,17130],{"class":5360}," bubbleStrategy",[5295,17132,5364],{"class":5338},[5295,17134,17135,17138,17141],{"class":5297,"line":13473},[5295,17136,17137],{"class":5331},"    QuickSort",[5295,17139,17140],{"class":5360}," quickStrategy",[5295,17142,5364],{"class":5338},[5295,17144,17145],{"class":5297,"line":13478},[5295,17146,5415],{"class":5338},[5295,17148,17149,17151,17154,17157,17160],{"class":5297,"line":13494},[5295,17150,16791],{"class":5331},[5295,17152,17153],{"class":5381}," processor",[5295,17155,17156],{"class":5338},"(&",[5295,17158,17159],{"class":5360},"bubbleStrategy",[5295,17161,5693],{"class":5338},[5295,17163,17164,17167,17169,17172,17174,17176],{"class":5297,"line":13511},[5295,17165,17166],{"class":5360},"    processor",[5295,17168,5618],{"class":5338},[5295,17170,17171],{"class":5381},"processData",[5295,17173,5385],{"class":5338},[5295,17175,17047],{"class":5360},[5295,17177,5693],{"class":5338},[5295,17179,17180],{"class":5297,"line":13516},[5295,17181,5415],{"class":5338},[5295,17183,17184],{"class":5297,"line":13521},[5295,17185,17186],{"class":5710},"    \u002F\u002F Динамічна зміна стратегії\n",[5295,17188,17189,17191,17193,17196,17198,17201],{"class":5297,"line":13526},[5295,17190,17166],{"class":5360},[5295,17192,5618],{"class":5338},[5295,17194,17195],{"class":5381},"setStrategy",[5295,17197,17156],{"class":5338},[5295,17199,17200],{"class":5360},"quickStrategy",[5295,17202,5693],{"class":5338},[5295,17204,17205,17207,17209,17211,17213,17215],{"class":5297,"line":13540},[5295,17206,17166],{"class":5360},[5295,17208,5618],{"class":5338},[5295,17210,17171],{"class":5381},[5295,17212,5385],{"class":5338},[5295,17214,17094],{"class":5360},[5295,17216,5693],{"class":5338},[5295,17218,17219],{"class":5297,"line":13545},[5295,17220,5415],{"class":5338},[5295,17222,17223,17225,17227],{"class":5297,"line":13550},[5295,17224,5722],{"class":5301},[5295,17226,5726],{"class":5725},[5295,17228,5364],{"class":5338},[5295,17230,17231],{"class":5297,"line":13560},[5295,17232,5655],{"class":5338},[5761,17234,17236,17240,17244,17247,17251],{"title":17235},".\u002FStrategy",[5765,17237,17239],{"className":17238},[5297],"Використовую стратегію: Bubble Sort",[5765,17241,17243],{"className":17242},[5297],"Відсортовані дані: 1 2 5 5 6 9",[5765,17245],{"className":17246},[5297],[5765,17248,17250],{"className":17249},[5297],"Використовую стратегію: Quick Sort",[5765,17252,17254],{"className":17253},[5297],"Відсортовані дані: 2 3 4 7 8",[5257,17256,12265,17257,17260,17261,12277,17263,17266,17267,7913,17270,17273,17274,5618],{},[5261,17258,17259],{},"DataProcessor"," не знає, який саме алгоритм сортування використовується — йому достатньо знати, що об'єкт ",[5261,17262,16806],{},[5261,17264,17265],{},"sort()",". Це дозволяє легко додавати нові алгоритми сортування (",[5261,17268,17269],{},"MergeSort",[5261,17271,17272],{},"HeapSort",") без зміни коду ",[5261,17275,17259],{},[5252,17277,17279],{"id":17278},"типові-помилки-та-підводні-камені","Типові помилки та підводні камені",[5929,17281,17283],{"id":17282},"помилка-1-забування-virtual-у-базовому-класі","Помилка 1: забування virtual у базовому класі",[5285,17285,17287],{"className":5287,"code":17286,"language":5290,"meta":5291,"style":5291},"class Base\n{\npublic:\n    void doSomething() { std::cout \u003C\u003C \"Base\\n\"; }  \u002F\u002F ❌ Відсутнє virtual\n};\n\nclass Derived : public Base\n{\npublic:\n    void doSomething() { std::cout \u003C\u003C \"Derived\\n\"; }\n};\n\nint main()\n{\n    Derived d;\n    Base* ptr = &d;\n    ptr->doSomething();  \u002F\u002F Виведе \"Base\", а не \"Derived\"\n}\n",[5261,17288,17289,17296,17300,17304,17334,17338,17342,17354,17358,17362,17387,17391,17395,17403,17407,17417,17433,17447],{"__ignoreMap":5291},[5295,17290,17291,17293],{"class":5297,"line":5298},[5295,17292,5328],{"class":5327},[5295,17294,17295],{"class":5331}," Base\n",[5295,17297,17298],{"class":5297,"line":5309},[5295,17299,5339],{"class":5338},[5295,17301,17302],{"class":5297,"line":5317},[5295,17303,5375],{"class":5327},[5295,17305,17306,17308,17311,17313,17315,17317,17319,17321,17324,17326,17328,17331],{"class":5297,"line":5324},[5295,17307,6170],{"class":5327},[5295,17309,17310],{"class":5381}," doSomething",[5295,17312,6176],{"class":5338},[5295,17314,5388],{"class":5331},[5295,17316,5354],{"class":5338},[5295,17318,5609],{"class":5360},[5295,17320,5612],{"class":5338},[5295,17322,17323],{"class":5305},"\"Base",[5295,17325,5645],{"class":5644},[5295,17327,5641],{"class":5305},[5295,17329,17330],{"class":5338},"; }",[5295,17332,17333],{"class":5710},"  \u002F\u002F ❌ Відсутнє virtual\n",[5295,17335,17336],{"class":5297,"line":5335},[5295,17337,5475],{"class":5338},[5295,17339,17340],{"class":5297,"line":5342},[5295,17341,5321],{"emptyLinePlaceholder":5320},[5295,17343,17344,17346,17348,17350,17352],{"class":5297,"line":5348},[5295,17345,5328],{"class":5327},[5295,17347,14720],{"class":5331},[5295,17349,5491],{"class":5338},[5295,17351,5494],{"class":5327},[5295,17353,17295],{"class":5331},[5295,17355,17356],{"class":5297,"line":5367},[5295,17357,5339],{"class":5338},[5295,17359,17360],{"class":5297,"line":5372},[5295,17361,5375],{"class":5327},[5295,17363,17364,17366,17368,17370,17372,17374,17376,17378,17381,17383,17385],{"class":5297,"line":5378},[5295,17365,6170],{"class":5327},[5295,17367,17310],{"class":5381},[5295,17369,6176],{"class":5338},[5295,17371,5388],{"class":5331},[5295,17373,5354],{"class":5338},[5295,17375,5609],{"class":5360},[5295,17377,5612],{"class":5338},[5295,17379,17380],{"class":5305},"\"Derived",[5295,17382,5645],{"class":5644},[5295,17384,5641],{"class":5305},[5295,17386,5444],{"class":5338},[5295,17388,17389],{"class":5297,"line":5412},[5295,17390,5475],{"class":5338},[5295,17392,17393],{"class":5297,"line":5418},[5295,17394,5321],{"emptyLinePlaceholder":5320},[5295,17396,17397,17399,17401],{"class":5297,"line":5447},[5295,17398,5666],{"class":5327},[5295,17400,5669],{"class":5381},[5295,17402,5672],{"class":5338},[5295,17404,17405],{"class":5297,"line":5472},[5295,17406,5339],{"class":5338},[5295,17408,17409,17412,17415],{"class":5297,"line":5478},[5295,17410,17411],{"class":5331},"    Derived",[5295,17413,17414],{"class":5360}," d",[5295,17416,5364],{"class":5338},[5295,17418,17419,17422,17424,17426,17428,17431],{"class":5297,"line":5483},[5295,17420,17421],{"class":5331},"    Base",[5295,17423,6241],{"class":5327},[5295,17425,9792],{"class":5360},[5295,17427,6247],{"class":5338},[5295,17429,17430],{"class":5360},"d",[5295,17432,5364],{"class":5338},[5295,17434,17435,17437,17439,17442,17444],{"class":5297,"line":5499},[5295,17436,9807],{"class":5360},[5295,17438,6339],{"class":5338},[5295,17440,17441],{"class":5381},"doSomething",[5295,17443,6534],{"class":5338},[5295,17445,17446],{"class":5710},"  \u002F\u002F Виведе \"Base\", а не \"Derived\"\n",[5295,17448,17449],{"class":5297,"line":5504},[5295,17450,5655],{"class":5338},[5257,17452,17453,17456,17457,17459],{},[5742,17454,17455],{},"Рішення",": завжди позначайте методи, призначені для перевизначення, як ",[5261,17458,5852],{}," у базовому класі.",[5929,17461,17463],{"id":17462},"помилка-2-невідповідність-сигнатур-забутий-const","Помилка 2: невідповідність сигнатур (забутий const)",[5285,17465,17467],{"className":5287,"code":17466,"language":5290,"meta":5291,"style":5291},"class Base\n{\npublic:\n    virtual void process() const { \u002F* ... *\u002F }  \u002F\u002F const метод\n};\n\nclass Derived : public Base\n{\npublic:\n    void process() { \u002F* ... *\u002F }  \u002F\u002F ❌ Забули const — не перевизначення!\n};\n",[5261,17468,17469,17475,17479,17483,17506,17510,17514,17526,17530,17534,17550],{"__ignoreMap":5291},[5295,17470,17471,17473],{"class":5297,"line":5298},[5295,17472,5328],{"class":5327},[5295,17474,17295],{"class":5331},[5295,17476,17477],{"class":5297,"line":5309},[5295,17478,5339],{"class":5338},[5295,17480,17481],{"class":5297,"line":5317},[5295,17482,5375],{"class":5327},[5295,17484,17485,17487,17489,17491,17493,17495,17498,17500,17503],{"class":5297,"line":5324},[5295,17486,7354],{"class":5327},[5295,17488,9666],{"class":5327},[5295,17490,14684],{"class":5381},[5295,17492,5430],{"class":5338},[5295,17494,5433],{"class":5327},[5295,17496,17497],{"class":5338}," {",[5295,17499,15173],{"class":5710},[5295,17501,17502],{"class":5338}," }",[5295,17504,17505],{"class":5710},"  \u002F\u002F const метод\n",[5295,17507,17508],{"class":5297,"line":5335},[5295,17509,5475],{"class":5338},[5295,17511,17512],{"class":5297,"line":5342},[5295,17513,5321],{"emptyLinePlaceholder":5320},[5295,17515,17516,17518,17520,17522,17524],{"class":5297,"line":5348},[5295,17517,5328],{"class":5327},[5295,17519,14720],{"class":5331},[5295,17521,5491],{"class":5338},[5295,17523,5494],{"class":5327},[5295,17525,17295],{"class":5331},[5295,17527,17528],{"class":5297,"line":5367},[5295,17529,5339],{"class":5338},[5295,17531,17532],{"class":5297,"line":5372},[5295,17533,5375],{"class":5327},[5295,17535,17536,17538,17540,17543,17545,17547],{"class":5297,"line":5378},[5295,17537,6170],{"class":5327},[5295,17539,14684],{"class":5381},[5295,17541,17542],{"class":5338},"() {",[5295,17544,15173],{"class":5710},[5295,17546,17502],{"class":5338},[5295,17548,17549],{"class":5710},"  \u002F\u002F ❌ Забули const — не перевизначення!\n",[5295,17551,17552],{"class":5297,"line":5412},[5295,17553,5475],{"class":5338},[5257,17555,17556,17558,17559,17561],{},[5742,17557,17455],{},": використовуйте специфікатор ",[5261,17560,5913],{}," (C++11), який змусить компілятор перевірити сигнатуру та видати помилку за невідповідності.",[5929,17563,17565],{"id":17564},"помилка-3-виклик-віртуальної-функції-в-конструкторі","Помилка 3: виклик віртуальної функції в конструкторі",[5285,17567,17569],{"className":5287,"code":17568,"language":5290,"meta":5291,"style":5291},"class Base\n{\npublic:\n    Base() { init(); }\n    virtual void init() { std::cout \u003C\u003C \"Base init\\n\"; }\n};\n\nclass Derived : public Base\n{\npublic:\n    Derived() { std::cout \u003C\u003C \"Derived constructor\\n\"; }\n    void init() override { std::cout \u003C\u003C \"Derived init\\n\"; }\n};\n\nint main()\n{\n    Derived d;  \u002F\u002F Виведе \"Base init\", а не \"Derived init\"\n}\n",[5261,17570,17571,17577,17581,17585,17597,17625,17629,17633,17645,17649,17653,17676,17705,17709,17713,17721,17725,17736],{"__ignoreMap":5291},[5295,17572,17573,17575],{"class":5297,"line":5298},[5295,17574,5328],{"class":5327},[5295,17576,17295],{"class":5331},[5295,17578,17579],{"class":5297,"line":5309},[5295,17580,5339],{"class":5338},[5295,17582,17583],{"class":5297,"line":5317},[5295,17584,5375],{"class":5327},[5295,17586,17587,17589,17591,17594],{"class":5297,"line":5324},[5295,17588,17421],{"class":5381},[5295,17590,6176],{"class":5338},[5295,17592,17593],{"class":5381},"init",[5295,17595,17596],{"class":5338},"(); }\n",[5295,17598,17599,17601,17603,17606,17608,17610,17612,17614,17616,17619,17621,17623],{"class":5297,"line":5335},[5295,17600,7354],{"class":5327},[5295,17602,9666],{"class":5327},[5295,17604,17605],{"class":5381}," init",[5295,17607,6176],{"class":5338},[5295,17609,5388],{"class":5331},[5295,17611,5354],{"class":5338},[5295,17613,5609],{"class":5360},[5295,17615,5612],{"class":5338},[5295,17617,17618],{"class":5305},"\"Base init",[5295,17620,5645],{"class":5644},[5295,17622,5641],{"class":5305},[5295,17624,5444],{"class":5338},[5295,17626,17627],{"class":5297,"line":5342},[5295,17628,5475],{"class":5338},[5295,17630,17631],{"class":5297,"line":5348},[5295,17632,5321],{"emptyLinePlaceholder":5320},[5295,17634,17635,17637,17639,17641,17643],{"class":5297,"line":5367},[5295,17636,5328],{"class":5327},[5295,17638,14720],{"class":5331},[5295,17640,5491],{"class":5338},[5295,17642,5494],{"class":5327},[5295,17644,17295],{"class":5331},[5295,17646,17647],{"class":5297,"line":5372},[5295,17648,5339],{"class":5338},[5295,17650,17651],{"class":5297,"line":5378},[5295,17652,5375],{"class":5327},[5295,17654,17655,17657,17659,17661,17663,17665,17667,17670,17672,17674],{"class":5297,"line":5412},[5295,17656,17411],{"class":5381},[5295,17658,6176],{"class":5338},[5295,17660,5388],{"class":5331},[5295,17662,5354],{"class":5338},[5295,17664,5609],{"class":5360},[5295,17666,5612],{"class":5338},[5295,17668,17669],{"class":5305},"\"Derived constructor",[5295,17671,5645],{"class":5644},[5295,17673,5641],{"class":5305},[5295,17675,5444],{"class":5338},[5295,17677,17678,17680,17682,17684,17686,17688,17690,17692,17694,17696,17699,17701,17703],{"class":5297,"line":5418},[5295,17679,6170],{"class":5327},[5295,17681,17605],{"class":5381},[5295,17683,5430],{"class":5338},[5295,17685,5913],{"class":5327},[5295,17687,5436],{"class":5338},[5295,17689,5388],{"class":5331},[5295,17691,5354],{"class":5338},[5295,17693,5609],{"class":5360},[5295,17695,5612],{"class":5338},[5295,17697,17698],{"class":5305},"\"Derived init",[5295,17700,5645],{"class":5644},[5295,17702,5641],{"class":5305},[5295,17704,5444],{"class":5338},[5295,17706,17707],{"class":5297,"line":5447},[5295,17708,5475],{"class":5338},[5295,17710,17711],{"class":5297,"line":5472},[5295,17712,5321],{"emptyLinePlaceholder":5320},[5295,17714,17715,17717,17719],{"class":5297,"line":5478},[5295,17716,5666],{"class":5327},[5295,17718,5669],{"class":5381},[5295,17720,5672],{"class":5338},[5295,17722,17723],{"class":5297,"line":5483},[5295,17724,5339],{"class":5338},[5295,17726,17727,17729,17731,17733],{"class":5297,"line":5499},[5295,17728,17411],{"class":5331},[5295,17730,17414],{"class":5360},[5295,17732,6252],{"class":5338},[5295,17734,17735],{"class":5710},"  \u002F\u002F Виведе \"Base init\", а не \"Derived init\"\n",[5295,17737,17738],{"class":5297,"line":5504},[5295,17739,5655],{"class":5338},[5257,17741,17742,17745,17746,17749,17750,17752,17753,5618],{},[5742,17743,17744],{},"Пояснення",": під час виконання конструктора ",[5261,17747,17748],{},"Base"," частина ",[5261,17751,11112],{}," ще не створена, тому викликається ",[5261,17754,17755],{},"Base::init()",[5257,17757,17758,17760,17761,17763],{},[5742,17759,17455],{},": не викликайте віртуальні функції в конструкторах. Якщо потрібна поліморфна ініціалізація, винесіть її в окремий метод ",[5261,17762,10842],{},", який викликається після конструювання.",[5929,17765,17767],{"id":17766},"помилка-4-відсутність-віртуального-деструктора","Помилка 4: відсутність віртуального деструктора",[5285,17769,17771],{"className":5287,"code":17770,"language":5290,"meta":5291,"style":5291},"class Base\n{\npublic:\n    ~Base() { std::cout \u003C\u003C \"~Base\\n\"; }  \u002F\u002F ❌ Не віртуальний!\n};\n\nclass Derived : public Base\n{\nprivate:\n    int* data;\npublic:\n    Derived() { data = new int[100]; }\n    ~Derived() { delete[] data; std::cout \u003C\u003C \"~Derived\\n\"; }\n};\n\nint main()\n{\n    Base* ptr = new Derived();\n    delete ptr;  \u002F\u002F Викличе тільки ~Base, ~Derived не виконається → витік пам'яті!\n}\n",[5261,17772,17773,17779,17783,17787,17814,17818,17822,17834,17838,17842,17851,17855,17877,17908,17912,17916,17924,17928,17944,17955],{"__ignoreMap":5291},[5295,17774,17775,17777],{"class":5297,"line":5298},[5295,17776,5328],{"class":5327},[5295,17778,17295],{"class":5331},[5295,17780,17781],{"class":5297,"line":5309},[5295,17782,5339],{"class":5338},[5295,17784,17785],{"class":5297,"line":5317},[5295,17786,5375],{"class":5327},[5295,17788,17789,17792,17794,17796,17798,17800,17802,17805,17807,17809,17811],{"class":5297,"line":5324},[5295,17790,17791],{"class":5381},"    ~Base",[5295,17793,6176],{"class":5338},[5295,17795,5388],{"class":5331},[5295,17797,5354],{"class":5338},[5295,17799,5609],{"class":5360},[5295,17801,5612],{"class":5338},[5295,17803,17804],{"class":5305},"\"~Base",[5295,17806,5645],{"class":5644},[5295,17808,5641],{"class":5305},[5295,17810,17330],{"class":5338},[5295,17812,17813],{"class":5710},"  \u002F\u002F ❌ Не віртуальний!\n",[5295,17815,17816],{"class":5297,"line":5335},[5295,17817,5475],{"class":5338},[5295,17819,17820],{"class":5297,"line":5342},[5295,17821,5321],{"emptyLinePlaceholder":5320},[5295,17823,17824,17826,17828,17830,17832],{"class":5297,"line":5348},[5295,17825,5328],{"class":5327},[5295,17827,14720],{"class":5331},[5295,17829,5491],{"class":5338},[5295,17831,5494],{"class":5327},[5295,17833,17295],{"class":5331},[5295,17835,17836],{"class":5297,"line":5367},[5295,17837,5339],{"class":5338},[5295,17839,17840],{"class":5297,"line":5372},[5295,17841,12995],{"class":5327},[5295,17843,17844,17847,17849],{"class":5297,"line":5378},[5295,17845,17846],{"class":5327},"    int*",[5295,17848,16321],{"class":5360},[5295,17850,5364],{"class":5338},[5295,17852,17853],{"class":5297,"line":5412},[5295,17854,5375],{"class":5327},[5295,17856,17857,17859,17861,17863,17865,17868,17870,17872,17874],{"class":5297,"line":5418},[5295,17858,17411],{"class":5381},[5295,17860,6176],{"class":5338},[5295,17862,16444],{"class":5360},[5295,17864,6276],{"class":5338},[5295,17866,17867],{"class":5301},"new",[5295,17869,9902],{"class":5327},[5295,17871,8524],{"class":5338},[5295,17873,13879],{"class":5725},[5295,17875,17876],{"class":5338},"]; }\n",[5295,17878,17879,17882,17884,17887,17889,17891,17893,17895,17897,17899,17902,17904,17906],{"class":5297,"line":5447},[5295,17880,17881],{"class":5381},"    ~Derived",[5295,17883,6176],{"class":5338},[5295,17885,17886],{"class":5301},"delete[]",[5295,17888,16321],{"class":5360},[5295,17890,8491],{"class":5338},[5295,17892,5388],{"class":5331},[5295,17894,5354],{"class":5338},[5295,17896,5609],{"class":5360},[5295,17898,5612],{"class":5338},[5295,17900,17901],{"class":5305},"\"~Derived",[5295,17903,5645],{"class":5644},[5295,17905,5641],{"class":5305},[5295,17907,5444],{"class":5338},[5295,17909,17910],{"class":5297,"line":5472},[5295,17911,5475],{"class":5338},[5295,17913,17914],{"class":5297,"line":5478},[5295,17915,5321],{"emptyLinePlaceholder":5320},[5295,17917,17918,17920,17922],{"class":5297,"line":5483},[5295,17919,5666],{"class":5327},[5295,17921,5669],{"class":5381},[5295,17923,5672],{"class":5338},[5295,17925,17926],{"class":5297,"line":5499},[5295,17927,5339],{"class":5338},[5295,17929,17930,17932,17934,17936,17938,17940,17942],{"class":5297,"line":5504},[5295,17931,17421],{"class":5331},[5295,17933,6241],{"class":5327},[5295,17935,9792],{"class":5360},[5295,17937,6276],{"class":5338},[5295,17939,17867],{"class":5301},[5295,17941,14720],{"class":5381},[5295,17943,14064],{"class":5338},[5295,17945,17946,17948,17950,17952],{"class":5297,"line":5509},[5295,17947,10421],{"class":5301},[5295,17949,9792],{"class":5360},[5295,17951,6252],{"class":5338},[5295,17953,17954],{"class":5710},"  \u002F\u002F Викличе тільки ~Base, ~Derived не виконається → витік пам'яті!\n",[5295,17956,17957],{"class":5297,"line":5535},[5295,17958,5655],{"class":5338},[5257,17960,17961,17963,17964,17967],{},[5742,17962,17455],{},": якщо клас має віртуальні методи, він ",[5742,17965,17966],{},"обов'язково повинен мати віртуальний деструктор",". Ми детально розглянемо цю тему в наступній статті.",[5252,17969,17971],{"id":17970},"підсумкові-рекомендації-та-найкращі-практики","Підсумкові рекомендації та найкращі практики",[5826,17973,17974,17997,18018,18042],{},[5829,17975,17978],{"icon":17976,"title":17977},"i-lucide-check-circle","✅ Завжди робіть",[5834,17979,17980,17985,17991,17994],{},[5837,17981,11005,17982,17984],{},[5261,17983,5852],{}," у базовому класі, якщо очікуєте їх перевизначення",[5837,17986,17987,17988,17990],{},"Використовуйте специфікатор ",[5261,17989,5913],{}," у похідних класах (C++11)",[5837,17992,17993],{},"Робіть деструктор віртуальним, якщо клас має віртуальні методи",[5837,17995,17996],{},"Проєктуйте інтерфейси (абстрактні класи) для визначення контрактів поведінки",[5829,17998,18001],{"icon":17999,"title":18000},"i-lucide-x-circle","❌ Ніколи не робіть",[5834,18002,18003,18006,18009,18015],{},[5837,18004,18005],{},"Не викликайте віртуальні функції в конструкторах або деструкторах",[5837,18007,18008],{},"Не робіть всі методи віртуальними «на всяк випадок» — це неефективно",[5837,18010,18011,18012,18014],{},"Не забувайте ",[5261,18013,5433],{}," у сигнатурі перевизначення, якщо базовий метод константний",[5837,18016,18017],{},"Не ігноруйте витоки пам'яті при роботі з поліморфними об'єктами через покажчики",[5829,18019,18022],{"icon":18020,"title":18021},"i-lucide-lightbulb","💡 Рекомендації",[5834,18023,18024,18033,18036,18039],{},[5837,18025,18026,18027,7913,18029,18032],{},"Використовуйте розумні покажчики (",[5261,18028,16219],{},[5261,18030,18031],{},"std::shared_ptr",") замість сирих покажчиків",[5837,18034,18035],{},"Віддавайте перевагу композиції над наслідуванням, де це доречно",[5837,18037,18038],{},"Документуйте контракти віртуальних методів: що вони повинні робити, які передумови та постумови",[5837,18040,18041],{},"Пишіть юніт-тести для перевірки коректності поліморфної поведінки",[5829,18043,18045],{"icon":5831,"title":18044},"🎯 Архітектурні принципи",[5834,18046,18047,18050,18053,18056],{},[5837,18048,18049],{},"Програмуйте до інтерфейсу, а не до реалізації",[5837,18051,18052],{},"Дотримуйтеся принципу відкритості\u002Fзакритості: код відкритий для розширення, закритий для модифікації",[5837,18054,18055],{},"Застосовуйте принцип інверсії залежностей: залежте від абстракцій, а не від конкретних класів",[5837,18057,18058,18059,18062,18063,18066],{},"Використовуйте поліморфізм для усунення умовних операторів (",[5261,18060,18061],{},"if","\u002F",[5261,18064,18065],{},"switch"," за типом)",[5252,18068,18070],{"id":18069},"візуальна-діаграма-динамічне-звязування-у-виконавчому-середовищі","Візуальна діаграма: динамічне зв'язування у виконавчому середовищі",[7165,18072,18074],{"alt":18073},"Повний процес виклику віртуального методу",[5285,18075,18077],{"className":7170,"code":18076,"language":7172,"meta":5291,"style":5291},"@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\n\nactor \"Програміст\" as Dev #DBEAFE\nparticipant \"Компілятор\" as Compiler #E2E8F0\nparticipant \"Виконавче середовище\" as Runtime #DCFCE7\ndatabase \"Віртуальна таблиця (vtable)\" as VTable #FEF3C7\n\nDev -> Compiler : Пише код: Animal* ptr = &dog;\\nptr->speak();\nCompiler -> Compiler : Бачить virtual у Animal::speak()\nCompiler -> Compiler : Генерує код непрямого виклику\nnote right of Compiler #DBEAFE\n  Статичне зв'язування:\n  - Звичайний метод → пряма адреса\n  \n  Динамічне зв'язування:\n  - virtual метод → через vtable\nend note\n\nCompiler -> Runtime : Передає згенерований код\nRuntime -> Runtime : Виконання: ptr->speak()\nRuntime -> VTable : Читає покажчик на vtable з об'єкта dog\nVTable -> Runtime : Повертає адресу Dog::speak()\nRuntime -> Runtime : Викликає Dog::speak()\n\nnote over Runtime #DCFCE7\n  Динамічне зв'язування:\n  Рішення приймається в runtime\n  на основі реального типу об'єкта\nend note\n\n@enduml\n",[5261,18078,18079,18083,18087,18091,18095,18100,18105,18110,18115,18119,18124,18129,18134,18139,18143,18148,18153,18158,18163,18167,18171,18176,18181,18186,18191,18196,18200,18205,18209,18214,18219,18223,18227],{"__ignoreMap":5291},[5295,18080,18081],{"class":5297,"line":5298},[5295,18082,7179],{},[5295,18084,18085],{"class":5297,"line":5309},[5295,18086,7184],{},[5295,18088,18089],{"class":5297,"line":5317},[5295,18090,7189],{},[5295,18092,18093],{"class":5297,"line":5324},[5295,18094,5321],{"emptyLinePlaceholder":5320},[5295,18096,18097],{"class":5297,"line":5335},[5295,18098,18099],{},"actor \"Програміст\" as Dev #DBEAFE\n",[5295,18101,18102],{"class":5297,"line":5342},[5295,18103,18104],{},"participant \"Компілятор\" as Compiler #E2E8F0\n",[5295,18106,18107],{"class":5297,"line":5348},[5295,18108,18109],{},"participant \"Виконавче середовище\" as Runtime #DCFCE7\n",[5295,18111,18112],{"class":5297,"line":5367},[5295,18113,18114],{},"database \"Віртуальна таблиця (vtable)\" as VTable #FEF3C7\n",[5295,18116,18117],{"class":5297,"line":5372},[5295,18118,5321],{"emptyLinePlaceholder":5320},[5295,18120,18121],{"class":5297,"line":5378},[5295,18122,18123],{},"Dev -> Compiler : Пише код: Animal* ptr = &dog;\\nptr->speak();\n",[5295,18125,18126],{"class":5297,"line":5412},[5295,18127,18128],{},"Compiler -> Compiler : Бачить virtual у Animal::speak()\n",[5295,18130,18131],{"class":5297,"line":5418},[5295,18132,18133],{},"Compiler -> Compiler : Генерує код непрямого виклику\n",[5295,18135,18136],{"class":5297,"line":5447},[5295,18137,18138],{},"note right of Compiler #DBEAFE\n",[5295,18140,18141],{"class":5297,"line":5472},[5295,18142,7237],{},[5295,18144,18145],{"class":5297,"line":5478},[5295,18146,18147],{},"  - Звичайний метод → пряма адреса\n",[5295,18149,18150],{"class":5297,"line":5483},[5295,18151,18152],{},"  \n",[5295,18154,18155],{"class":5297,"line":5499},[5295,18156,18157],{},"  Динамічне зв'язування:\n",[5295,18159,18160],{"class":5297,"line":5504},[5295,18161,18162],{},"  - virtual метод → через vtable\n",[5295,18164,18165],{"class":5297,"line":5509},[5295,18166,7247],{},[5295,18168,18169],{"class":5297,"line":5535},[5295,18170,5321],{"emptyLinePlaceholder":5320},[5295,18172,18173],{"class":5297,"line":5540},[5295,18174,18175],{},"Compiler -> Runtime : Передає згенерований код\n",[5295,18177,18178],{"class":5297,"line":5562},[5295,18179,18180],{},"Runtime -> Runtime : Виконання: ptr->speak()\n",[5295,18182,18183],{"class":5297,"line":5567},[5295,18184,18185],{},"Runtime -> VTable : Читає покажчик на vtable з об'єкта dog\n",[5295,18187,18188],{"class":5297,"line":5572},[5295,18189,18190],{},"VTable -> Runtime : Повертає адресу Dog::speak()\n",[5295,18192,18193],{"class":5297,"line":5597},[5295,18194,18195],{},"Runtime -> Runtime : Викликає Dog::speak()\n",[5295,18197,18198],{"class":5297,"line":5602},[5295,18199,5321],{"emptyLinePlaceholder":5320},[5295,18201,18202],{"class":5297,"line":5652},[5295,18203,18204],{},"note over Runtime #DCFCE7\n",[5295,18206,18207],{"class":5297,"line":5658},[5295,18208,18157],{},[5295,18210,18211],{"class":5297,"line":5663},[5295,18212,18213],{},"  Рішення приймається в runtime\n",[5295,18215,18216],{"class":5297,"line":5675},[5295,18217,18218],{},"  на основі реального типу об'єкта\n",[5295,18220,18221],{"class":5297,"line":5680},[5295,18222,7247],{},[5295,18224,18225],{"class":5297,"line":5696},[5295,18226,5321],{"emptyLinePlaceholder":5320},[5295,18228,18229],{"class":5297,"line":5714},[5295,18230,7276],{},[5257,18232,18233],{},"Ця діаграма ілюструє повний цикл від написання коду до виконання віртуального виклику. Ключовий момент: компілятор не знає, який саме метод буде викликано — він генерує код, що делегує це рішення виконавчому середовищу.",[5252,18235,18237],{"id":18236},"погляд-вперед-що-далі","Погляд вперед: що далі",[5257,18239,18240],{},"У цій статті ми опанували фундаментальні концепції віртуальних функцій та поліморфізму. Проте ми лише торкнулися поверхні цієї теми. У наступних статтях ми вивчимо:",[5834,18242,18243,18253,18259,18265,18271,18277],{},[5837,18244,18245,18252],{},[5742,18246,18247,18248,7490,18250],{},"Специфікатори ",[5261,18249,5913],{},[5261,18251,10948],{}," (C++11): як уникнути підступних помилок у сигнатурах віртуальних методів та заборонити подальше перевизначення",[5837,18254,18255,18258],{},[5742,18256,18257],{},"Віртуальні деструктори",": чому вони критично важливі для коректного видалення поліморфних об'єктів",[5837,18260,18261,18264],{},[5742,18262,18263],{},"Віртуальні таблиці (vtable)",": як C++ реалізує динамічне зв'язування під капотом",[5837,18266,18267,18270],{},[5742,18268,18269],{},"Абстрактні класи та інтерфейси",": проєктування контрактів поведінки через чисто віртуальні функції",[5837,18272,18273,18276],{},[5742,18274,18275],{},"Множинне наслідування",": як поєднувати кілька інтерфейсів та уникати проблеми діамантового наслідування",[5837,18278,18279,18286],{},[5742,18280,18281,18282,18285],{},"Динамічне приведення типів (",[5261,18283,18284],{},"dynamic_cast",") та RTTI",": як безпечно перевірити реальний тип об'єкта в runtime",[5257,18288,18289],{},"Поліморфізм — це інструмент, що відкриває шлях до написання гнучких, розширюваних та підтримуваних систем. Опануйте його — і ваш код стане значно елегантнішим.",[11036,18291,18292,19125],{},[11039,18293,18295,19103],{"icon":17976,"label":18294},"✅ Розв'язок: Завдання 1 — Поліморфна геометрія",[5285,18296,18298],{"className":5287,"code":18297,"language":5290,"meta":5291,"style":5291},"#include \u003Ciostream>\n#include \u003Ccmath>\n#include \u003Cvector>\n\nclass Shape\n{\npublic:\n    virtual ~Shape() {}\n    virtual double getArea() const = 0;  \u002F\u002F Чисто віртуальна функція\n    virtual const char* getName() const = 0;\n};\n\nclass Circle : public Shape\n{\nprivate:\n    double radius;\n\npublic:\n    Circle(double r) : radius(r) {}\n    \n    double getArea() const override\n    {\n        return 3.14159 * radius * radius;\n    }\n    \n    const char* getName() const override { return \"Circle\"; }\n};\n\nclass Rectangle : public Shape\n{\nprivate:\n    double width, height;\n\npublic:\n    Rectangle(double w, double h) : width(w), height(h) {}\n    \n    double getArea() const override\n    {\n        return width * height;\n    }\n    \n    const char* getName() const override { return \"Rectangle\"; }\n};\n\nclass Triangle : public Shape\n{\nprivate:\n    double base, height;\n\npublic:\n    Triangle(double b, double h) : base(b), height(h) {}\n    \n    double getArea() const override\n    {\n        return 0.5 * base * height;\n    }\n    \n    const char* getName() const override { return \"Triangle\"; }\n};\n\nint main()\n{\n    Circle c(5.0);\n    Rectangle r(4.0, 6.0);\n    Triangle t(3.0, 8.0);\n    \n    std::vector\u003CShape*> shapes = { &c, &r, &t };\n    \n    double totalArea = 0.0;\n    \n    for (Shape* shape : shapes) {\n        double area = shape->getArea();\n        std::cout \u003C\u003C shape->getName() \u003C\u003C \": площа = \" \u003C\u003C area \u003C\u003C \"\\n\";\n        totalArea += area;\n    }\n    \n    std::cout \u003C\u003C \"\\nЗагальна площа всіх фігур: \" \u003C\u003C totalArea \u003C\u003C \"\\n\";\n    \n    return 0;\n}\n",[5261,18299,18300,18306,18313,18319,18323,18330,18334,18338,18347,18369,18389,18393,18397,18410,18414,18418,18427,18431,18435,18459,18463,18475,18479,18497,18501,18505,18528,18532,18536,18549,18553,18557,18569,18573,18577,18612,18616,18628,18632,18644,18648,18652,18675,18679,18683,18696,18700,18704,18717,18721,18725,18763,18767,18779,18783,18800,18804,18808,18831,18835,18839,18847,18851,18865,18883,18902,18906,18939,18943,18957,18961,18980,19000,19036,19047,19051,19055,19087,19091,19099],{"__ignoreMap":5291},[5295,18301,18302,18304],{"class":5297,"line":5298},[5295,18303,5302],{"class":5301},[5295,18305,5306],{"class":5305},[5295,18307,18308,18310],{"class":5297,"line":5309},[5295,18309,5302],{"class":5301},[5295,18311,18312],{"class":5305}," \u003Ccmath>\n",[5295,18314,18315,18317],{"class":5297,"line":5317},[5295,18316,5302],{"class":5301},[5295,18318,12672],{"class":5305},[5295,18320,18321],{"class":5297,"line":5324},[5295,18322,5321],{"emptyLinePlaceholder":5320},[5295,18324,18325,18327],{"class":5297,"line":5335},[5295,18326,5328],{"class":5327},[5295,18328,18329],{"class":5331}," Shape\n",[5295,18331,18332],{"class":5297,"line":5342},[5295,18333,5339],{"class":5338},[5295,18335,18336],{"class":5297,"line":5348},[5295,18337,5375],{"class":5327},[5295,18339,18340,18342,18345],{"class":5297,"line":5367},[5295,18341,7354],{"class":5327},[5295,18343,18344],{"class":5381}," ~Shape",[5295,18346,12820],{"class":5338},[5295,18348,18349,18351,18353,18356,18358,18360,18362,18364,18366],{"class":5297,"line":5372},[5295,18350,7354],{"class":5327},[5295,18352,9957],{"class":5327},[5295,18354,18355],{"class":5381}," getArea",[5295,18357,5430],{"class":5338},[5295,18359,5433],{"class":5327},[5295,18361,6276],{"class":5338},[5295,18363,8488],{"class":5725},[5295,18365,6252],{"class":5338},[5295,18367,18368],{"class":5710},"  \u002F\u002F Чисто віртуальна функція\n",[5295,18370,18371,18373,18375,18377,18379,18381,18383,18385,18387],{"class":5297,"line":5378},[5295,18372,7354],{"class":5327},[5295,18374,7357],{"class":5327},[5295,18376,5453],{"class":5327},[5295,18378,5427],{"class":5381},[5295,18380,5430],{"class":5338},[5295,18382,5433],{"class":5327},[5295,18384,6276],{"class":5338},[5295,18386,8488],{"class":5725},[5295,18388,5364],{"class":5338},[5295,18390,18391],{"class":5297,"line":5412},[5295,18392,5475],{"class":5338},[5295,18394,18395],{"class":5297,"line":5418},[5295,18396,5321],{"emptyLinePlaceholder":5320},[5295,18398,18399,18401,18404,18406,18408],{"class":5297,"line":5447},[5295,18400,5328],{"class":5327},[5295,18402,18403],{"class":5331}," Circle",[5295,18405,5491],{"class":5338},[5295,18407,5494],{"class":5327},[5295,18409,18329],{"class":5331},[5295,18411,18412],{"class":5297,"line":5472},[5295,18413,5339],{"class":5338},[5295,18415,18416],{"class":5297,"line":5478},[5295,18417,12995],{"class":5327},[5295,18419,18420,18422,18425],{"class":5297,"line":5483},[5295,18421,15056],{"class":5327},[5295,18423,18424],{"class":5360}," radius",[5295,18426,5364],{"class":5338},[5295,18428,18429],{"class":5297,"line":5499},[5295,18430,5321],{"emptyLinePlaceholder":5320},[5295,18432,18433],{"class":5297,"line":5504},[5295,18434,5375],{"class":5327},[5295,18436,18437,18440,18442,18444,18447,18449,18452,18454,18457],{"class":5297,"line":5509},[5295,18438,18439],{"class":5381},"    Circle",[5295,18441,5385],{"class":5338},[5295,18443,9985],{"class":5327},[5295,18445,18446],{"class":5360}," r",[5295,18448,5398],{"class":5338},[5295,18450,18451],{"class":5381},"radius",[5295,18453,5385],{"class":5338},[5295,18455,18456],{"class":5360},"r",[5295,18458,5409],{"class":5338},[5295,18460,18461],{"class":5297,"line":5535},[5295,18462,5415],{"class":5338},[5295,18464,18465,18467,18469,18471,18473],{"class":5297,"line":5540},[5295,18466,15056],{"class":5327},[5295,18468,18355],{"class":5381},[5295,18470,5430],{"class":5338},[5295,18472,5433],{"class":5327},[5295,18474,10340],{"class":5327},[5295,18476,18477],{"class":5297,"line":5562},[5295,18478,10059],{"class":5338},[5295,18480,18481,18483,18486,18489,18491,18493,18495],{"class":5297,"line":5567},[5295,18482,10064],{"class":5301},[5295,18484,18485],{"class":5725}," 3.14159",[5295,18487,18488],{"class":5338}," * ",[5295,18490,18451],{"class":5360},[5295,18492,18488],{"class":5338},[5295,18494,18451],{"class":5360},[5295,18496,5364],{"class":5338},[5295,18498,18499],{"class":5297,"line":5572},[5295,18500,8546],{"class":5338},[5295,18502,18503],{"class":5297,"line":5597},[5295,18504,5415],{"class":5338},[5295,18506,18507,18509,18511,18513,18515,18517,18519,18521,18523,18526],{"class":5297,"line":5602},[5295,18508,5450],{"class":5327},[5295,18510,5453],{"class":5327},[5295,18512,5427],{"class":5381},[5295,18514,5430],{"class":5338},[5295,18516,5433],{"class":5327},[5295,18518,14751],{"class":5327},[5295,18520,5436],{"class":5338},[5295,18522,5439],{"class":5301},[5295,18524,18525],{"class":5305}," \"Circle\"",[5295,18527,5444],{"class":5338},[5295,18529,18530],{"class":5297,"line":5652},[5295,18531,5475],{"class":5338},[5295,18533,18534],{"class":5297,"line":5658},[5295,18535,5321],{"emptyLinePlaceholder":5320},[5295,18537,18538,18540,18543,18545,18547],{"class":5297,"line":5663},[5295,18539,5328],{"class":5327},[5295,18541,18542],{"class":5331}," Rectangle",[5295,18544,5491],{"class":5338},[5295,18546,5494],{"class":5327},[5295,18548,18329],{"class":5331},[5295,18550,18551],{"class":5297,"line":5675},[5295,18552,5339],{"class":5338},[5295,18554,18555],{"class":5297,"line":5680},[5295,18556,12995],{"class":5327},[5295,18558,18559,18561,18563,18565,18567],{"class":5297,"line":5696},[5295,18560,15056],{"class":5327},[5295,18562,12713],{"class":5360},[5295,18564,7913],{"class":5338},[5295,18566,12718],{"class":5360},[5295,18568,5364],{"class":5338},[5295,18570,18571],{"class":5297,"line":5714},[5295,18572,5321],{"emptyLinePlaceholder":5320},[5295,18574,18575],{"class":5297,"line":5719},[5295,18576,5375],{"class":5327},[5295,18578,18579,18582,18584,18586,18588,18590,18592,18594,18596,18598,18600,18602,18604,18606,18608,18610],{"class":5297,"line":5731},[5295,18580,18581],{"class":5381},"    Rectangle",[5295,18583,5385],{"class":5338},[5295,18585,9985],{"class":5327},[5295,18587,12754],{"class":5360},[5295,18589,7913],{"class":5338},[5295,18591,9985],{"class":5327},[5295,18593,12761],{"class":5360},[5295,18595,5398],{"class":5338},[5295,18597,12790],{"class":5381},[5295,18599,5385],{"class":5338},[5295,18601,12795],{"class":5360},[5295,18603,8413],{"class":5338},[5295,18605,12718],{"class":5381},[5295,18607,5385],{"class":5338},[5295,18609,12804],{"class":5360},[5295,18611,5409],{"class":5338},[5295,18613,18614],{"class":5297,"line":6354},[5295,18615,5415],{"class":5338},[5295,18617,18618,18620,18622,18624,18626],{"class":5297,"line":6387},[5295,18619,15056],{"class":5327},[5295,18621,18355],{"class":5381},[5295,18623,5430],{"class":5338},[5295,18625,5433],{"class":5327},[5295,18627,10340],{"class":5327},[5295,18629,18630],{"class":5297,"line":6392},[5295,18631,10059],{"class":5338},[5295,18633,18634,18636,18638,18640,18642],{"class":5297,"line":6401},[5295,18635,10064],{"class":5301},[5295,18637,12713],{"class":5360},[5295,18639,18488],{"class":5338},[5295,18641,12718],{"class":5360},[5295,18643,5364],{"class":5338},[5295,18645,18646],{"class":5297,"line":9032},[5295,18647,8546],{"class":5338},[5295,18649,18650],{"class":5297,"line":9045},[5295,18651,5415],{"class":5338},[5295,18653,18654,18656,18658,18660,18662,18664,18666,18668,18670,18673],{"class":5297,"line":9059},[5295,18655,5450],{"class":5327},[5295,18657,5453],{"class":5327},[5295,18659,5427],{"class":5381},[5295,18661,5430],{"class":5338},[5295,18663,5433],{"class":5327},[5295,18665,14751],{"class":5327},[5295,18667,5436],{"class":5338},[5295,18669,5439],{"class":5301},[5295,18671,18672],{"class":5305}," \"Rectangle\"",[5295,18674,5444],{"class":5338},[5295,18676,18677],{"class":5297,"line":9073},[5295,18678,5475],{"class":5338},[5295,18680,18681],{"class":5297,"line":9078},[5295,18682,5321],{"emptyLinePlaceholder":5320},[5295,18684,18685,18687,18690,18692,18694],{"class":5297,"line":9084},[5295,18686,5328],{"class":5327},[5295,18688,18689],{"class":5331}," Triangle",[5295,18691,5491],{"class":5338},[5295,18693,5494],{"class":5327},[5295,18695,18329],{"class":5331},[5295,18697,18698],{"class":5297,"line":9121},[5295,18699,5339],{"class":5338},[5295,18701,18702],{"class":5297,"line":9126},[5295,18703,12995],{"class":5327},[5295,18705,18706,18708,18711,18713,18715],{"class":5297,"line":9146},[5295,18707,15056],{"class":5327},[5295,18709,18710],{"class":5360}," base",[5295,18712,7913],{"class":5338},[5295,18714,12718],{"class":5360},[5295,18716,5364],{"class":5338},[5295,18718,18719],{"class":5297,"line":9176},[5295,18720,5321],{"emptyLinePlaceholder":5320},[5295,18722,18723],{"class":5297,"line":9207},[5295,18724,5375],{"class":5327},[5295,18726,18727,18730,18732,18734,18737,18739,18741,18743,18745,18748,18750,18753,18755,18757,18759,18761],{"class":5297,"line":9237},[5295,18728,18729],{"class":5381},"    Triangle",[5295,18731,5385],{"class":5338},[5295,18733,9985],{"class":5327},[5295,18735,18736],{"class":5360}," b",[5295,18738,7913],{"class":5338},[5295,18740,9985],{"class":5327},[5295,18742,12761],{"class":5360},[5295,18744,5398],{"class":5338},[5295,18746,18747],{"class":5381},"base",[5295,18749,5385],{"class":5338},[5295,18751,18752],{"class":5360},"b",[5295,18754,8413],{"class":5338},[5295,18756,12718],{"class":5381},[5295,18758,5385],{"class":5338},[5295,18760,12804],{"class":5360},[5295,18762,5409],{"class":5338},[5295,18764,18765],{"class":5297,"line":9242},[5295,18766,5415],{"class":5338},[5295,18768,18769,18771,18773,18775,18777],{"class":5297,"line":9247},[5295,18770,15056],{"class":5327},[5295,18772,18355],{"class":5381},[5295,18774,5430],{"class":5338},[5295,18776,5433],{"class":5327},[5295,18778,10340],{"class":5327},[5295,18780,18781],{"class":5297,"line":9256},[5295,18782,10059],{"class":5338},[5295,18784,18785,18787,18790,18792,18794,18796,18798],{"class":5297,"line":13229},[5295,18786,10064],{"class":5301},[5295,18788,18789],{"class":5725}," 0.5",[5295,18791,18488],{"class":5338},[5295,18793,18747],{"class":5360},[5295,18795,18488],{"class":5338},[5295,18797,12718],{"class":5360},[5295,18799,5364],{"class":5338},[5295,18801,18802],{"class":5297,"line":13243},[5295,18803,8546],{"class":5338},[5295,18805,18806],{"class":5297,"line":13248},[5295,18807,5415],{"class":5338},[5295,18809,18810,18812,18814,18816,18818,18820,18822,18824,18826,18829],{"class":5297,"line":13253},[5295,18811,5450],{"class":5327},[5295,18813,5453],{"class":5327},[5295,18815,5427],{"class":5381},[5295,18817,5430],{"class":5338},[5295,18819,5433],{"class":5327},[5295,18821,14751],{"class":5327},[5295,18823,5436],{"class":5338},[5295,18825,5439],{"class":5301},[5295,18827,18828],{"class":5305}," \"Triangle\"",[5295,18830,5444],{"class":5338},[5295,18832,18833],{"class":5297,"line":13285},[5295,18834,5475],{"class":5338},[5295,18836,18837],{"class":5297,"line":13320},[5295,18838,5321],{"emptyLinePlaceholder":5320},[5295,18840,18841,18843,18845],{"class":5297,"line":13325},[5295,18842,5666],{"class":5327},[5295,18844,5669],{"class":5381},[5295,18846,5672],{"class":5338},[5295,18848,18849],{"class":5297,"line":13336},[5295,18850,5339],{"class":5338},[5295,18852,18853,18855,18858,18860,18863],{"class":5297,"line":13341},[5295,18854,18439],{"class":5331},[5295,18856,18857],{"class":5381}," c",[5295,18859,5385],{"class":5338},[5295,18861,18862],{"class":5725},"5.0",[5295,18864,5693],{"class":5338},[5295,18866,18867,18869,18871,18873,18876,18878,18881],{"class":5297,"line":13361},[5295,18868,18581],{"class":5331},[5295,18870,18446],{"class":5381},[5295,18872,5385],{"class":5338},[5295,18874,18875],{"class":5725},"4.0",[5295,18877,7913],{"class":5338},[5295,18879,18880],{"class":5725},"6.0",[5295,18882,5693],{"class":5338},[5295,18884,18885,18887,18890,18892,18895,18897,18900],{"class":5297,"line":13366},[5295,18886,18729],{"class":5331},[5295,18888,18889],{"class":5381}," t",[5295,18891,5385],{"class":5338},[5295,18893,18894],{"class":5725},"3.0",[5295,18896,7913],{"class":5338},[5295,18898,18899],{"class":5725},"8.0",[5295,18901,5693],{"class":5338},[5295,18903,18904],{"class":5297,"line":13371},[5295,18905,5415],{"class":5338},[5295,18907,18908,18910,18912,18914,18916,18918,18920,18923,18925,18928,18930,18932,18934,18937],{"class":5297,"line":13389},[5295,18909,5351],{"class":5331},[5295,18911,5354],{"class":5338},[5295,18913,13977],{"class":5331},[5295,18915,10200],{"class":5338},[5295,18917,11046],{"class":5331},[5295,18919,13984],{"class":5338},[5295,18921,18922],{"class":5360},"shapes",[5295,18924,13990],{"class":5338},[5295,18926,18927],{"class":5360},"c",[5295,18929,9099],{"class":5338},[5295,18931,18456],{"class":5360},[5295,18933,9099],{"class":5338},[5295,18935,18936],{"class":5360},"t",[5295,18938,9118],{"class":5338},[5295,18940,18941],{"class":5297,"line":13394},[5295,18942,5415],{"class":5338},[5295,18944,18945,18947,18950,18952,18955],{"class":5297,"line":13407},[5295,18946,15056],{"class":5327},[5295,18948,18949],{"class":5360}," totalArea",[5295,18951,6276],{"class":5338},[5295,18953,18954],{"class":5725},"0.0",[5295,18956,5364],{"class":5338},[5295,18958,18959],{"class":5297,"line":13428},[5295,18960,5415],{"class":5338},[5295,18962,18963,18965,18967,18969,18971,18974,18976,18978],{"class":5297,"line":13450},[5295,18964,8476],{"class":5301},[5295,18966,5805],{"class":5338},[5295,18968,11046],{"class":5331},[5295,18970,6241],{"class":5327},[5295,18972,18973],{"class":5360}," shape",[5295,18975,5491],{"class":5338},[5295,18977,18922],{"class":5360},[5295,18979,14050],{"class":5338},[5295,18981,18982,18985,18988,18990,18993,18995,18998],{"class":5297,"line":13455},[5295,18983,18984],{"class":5327},"        double",[5295,18986,18987],{"class":5360}," area",[5295,18989,6276],{"class":5338},[5295,18991,18992],{"class":5360},"shape",[5295,18994,6339],{"class":5338},[5295,18996,18997],{"class":5381},"getArea",[5295,18999,14064],{"class":5338},[5295,19001,19002,19004,19006,19008,19010,19012,19014,19016,19018,19021,19023,19026,19028,19030,19032,19034],{"class":5297,"line":13460},[5295,19003,8512],{"class":5331},[5295,19005,5354],{"class":5338},[5295,19007,5609],{"class":5360},[5295,19009,5612],{"class":5338},[5295,19011,18992],{"class":5360},[5295,19013,6339],{"class":5338},[5295,19015,5621],{"class":5381},[5295,19017,5624],{"class":5338},[5295,19019,19020],{"class":5305},"\": площа = \"",[5295,19022,5612],{"class":5338},[5295,19024,19025],{"class":5360},"area",[5295,19027,5612],{"class":5338},[5295,19029,5641],{"class":5305},[5295,19031,5645],{"class":5644},[5295,19033,5641],{"class":5305},[5295,19035,5364],{"class":5338},[5295,19037,19038,19041,19043,19045],{"class":5297,"line":13473},[5295,19039,19040],{"class":5360},"        totalArea",[5295,19042,13400],{"class":5338},[5295,19044,19025],{"class":5360},[5295,19046,5364],{"class":5338},[5295,19048,19049],{"class":5297,"line":13478},[5295,19050,8546],{"class":5338},[5295,19052,19053],{"class":5297,"line":13494},[5295,19054,5415],{"class":5338},[5295,19056,19057,19059,19061,19063,19065,19067,19069,19072,19074,19077,19079,19081,19083,19085],{"class":5297,"line":13511},[5295,19058,5351],{"class":5331},[5295,19060,5354],{"class":5338},[5295,19062,5609],{"class":5360},[5295,19064,5612],{"class":5338},[5295,19066,5641],{"class":5305},[5295,19068,5645],{"class":5644},[5295,19070,19071],{"class":5305},"Загальна площа всіх фігур: \"",[5295,19073,5612],{"class":5338},[5295,19075,19076],{"class":5360},"totalArea",[5295,19078,5612],{"class":5338},[5295,19080,5641],{"class":5305},[5295,19082,5645],{"class":5644},[5295,19084,5641],{"class":5305},[5295,19086,5364],{"class":5338},[5295,19088,19089],{"class":5297,"line":13516},[5295,19090,5415],{"class":5338},[5295,19092,19093,19095,19097],{"class":5297,"line":13521},[5295,19094,5722],{"class":5301},[5295,19096,5726],{"class":5725},[5295,19098,5364],{"class":5338},[5295,19100,19101],{"class":5297,"line":13526},[5295,19102,5655],{"class":5338},[5761,19104,19106,19110,19114,19118,19121],{"title":19105},".\u002FPolymorphicGeometry",[5765,19107,19109],{"className":19108},[5297],"Circle: площа = 78.5398",[5765,19111,19113],{"className":19112},[5297],"Rectangle: площа = 24",[5765,19115,19117],{"className":19116},[5297],"Triangle: площа = 12",[5765,19119],{"className":19120},[5297],[5765,19122,19124],{"className":19123},[5297],"Загальна площа всіх фігур: 114.54",[11039,19126,19128,19879],{"icon":17976,"label":19127},"✅ Розв'язок: Завдання 2 — Поліморфний друк",[5285,19129,19131],{"className":5287,"code":19130,"language":5290,"meta":5291,"style":5291},"#include \u003Ciostream>\n#include \u003Cfstream>\n#include \u003Calgorithm>\n#include \u003Cstring>\n\nclass Printer\n{\npublic:\n    virtual ~Printer() {}\n    virtual void print(const std::string& text) const = 0;\n};\n\nclass ConsolePrinter : public Printer\n{\npublic:\n    void print(const std::string& text) const override\n    {\n        std::cout \u003C\u003C \"[Console] \" \u003C\u003C text \u003C\u003C \"\\n\";\n    }\n};\n\nclass FilePrinter : public Printer\n{\nprivate:\n    std::string filename;\n\npublic:\n    FilePrinter(std::string fname) : filename(fname) {}\n    \n    void print(const std::string& text) const override\n    {\n        std::ofstream file(filename, std::ios::app);\n        if (file.is_open()) {\n            file \u003C\u003C text \u003C\u003C \"\\n\";\n            std::cout \u003C\u003C \"[File] Записано у \" \u003C\u003C filename \u003C\u003C \"\\n\";\n        }\n    }\n};\n\nclass UpperCasePrinter : public Printer\n{\npublic:\n    void print(const std::string& text) const override\n    {\n        std::string upper = text;\n        std::transform(upper.begin(), upper.end(), upper.begin(), ::toupper);\n        std::cout \u003C\u003C \"[UpperCase] \" \u003C\u003C upper \u003C\u003C \"\\n\";\n    }\n};\n\nvoid sendDocument(const Printer& printer, const std::string& doc)\n{\n    printer.print(doc);\n}\n\nint main()\n{\n    ConsolePrinter console;\n    FilePrinter file(\"output.txt\");\n    UpperCasePrinter upper;\n    \n    std::string document = \"Важливий документ для друку\";\n    \n    sendDocument(console, document);\n    sendDocument(file, document);\n    sendDocument(upper, document);\n    \n    return 0;\n}\n",[5261,19132,19133,19139,19146,19152,19158,19162,19169,19173,19177,19186,19220,19224,19228,19241,19245,19249,19275,19279,19307,19311,19315,19319,19332,19336,19340,19353,19357,19361,19389,19393,19419,19423,19455,19472,19491,19518,19522,19526,19530,19534,19547,19551,19555,19581,19585,19602,19644,19671,19675,19679,19683,19719,19723,19740,19744,19748,19756,19760,19770,19783,19792,19796,19814,19818,19835,19849,19863,19867,19875],{"__ignoreMap":5291},[5295,19134,19135,19137],{"class":5297,"line":5298},[5295,19136,5302],{"class":5301},[5295,19138,5306],{"class":5305},[5295,19140,19141,19143],{"class":5297,"line":5309},[5295,19142,5302],{"class":5301},[5295,19144,19145],{"class":5305}," \u003Cfstream>\n",[5295,19147,19148,19150],{"class":5297,"line":5317},[5295,19149,5302],{"class":5301},[5295,19151,16259],{"class":5305},[5295,19153,19154,19156],{"class":5297,"line":5324},[5295,19155,5302],{"class":5301},[5295,19157,5314],{"class":5305},[5295,19159,19160],{"class":5297,"line":5335},[5295,19161,5321],{"emptyLinePlaceholder":5320},[5295,19163,19164,19166],{"class":5297,"line":5342},[5295,19165,5328],{"class":5327},[5295,19167,19168],{"class":5331}," Printer\n",[5295,19170,19171],{"class":5297,"line":5348},[5295,19172,5339],{"class":5338},[5295,19174,19175],{"class":5297,"line":5367},[5295,19176,5375],{"class":5327},[5295,19178,19179,19181,19184],{"class":5297,"line":5372},[5295,19180,7354],{"class":5327},[5295,19182,19183],{"class":5381}," ~Printer",[5295,19185,12820],{"class":5338},[5295,19187,19188,19190,19192,19195,19197,19199,19201,19203,19205,19207,19210,19212,19214,19216,19218],{"class":5297,"line":5378},[5295,19189,7354],{"class":5327},[5295,19191,9666],{"class":5327},[5295,19193,19194],{"class":5381}," print",[5295,19196,5385],{"class":5338},[5295,19198,5433],{"class":5327},[5295,19200,15088],{"class":5331},[5295,19202,5354],{"class":5338},[5295,19204,5357],{"class":5331},[5295,19206,5588],{"class":5327},[5295,19208,19209],{"class":5360}," text",[5295,19211,13384],{"class":5338},[5295,19213,5433],{"class":5327},[5295,19215,6276],{"class":5338},[5295,19217,8488],{"class":5725},[5295,19219,5364],{"class":5338},[5295,19221,19222],{"class":5297,"line":5412},[5295,19223,5475],{"class":5338},[5295,19225,19226],{"class":5297,"line":5418},[5295,19227,5321],{"emptyLinePlaceholder":5320},[5295,19229,19230,19232,19235,19237,19239],{"class":5297,"line":5447},[5295,19231,5328],{"class":5327},[5295,19233,19234],{"class":5331}," ConsolePrinter",[5295,19236,5491],{"class":5338},[5295,19238,5494],{"class":5327},[5295,19240,19168],{"class":5331},[5295,19242,19243],{"class":5297,"line":5472},[5295,19244,5339],{"class":5338},[5295,19246,19247],{"class":5297,"line":5478},[5295,19248,5375],{"class":5327},[5295,19250,19251,19253,19255,19257,19259,19261,19263,19265,19267,19269,19271,19273],{"class":5297,"line":5483},[5295,19252,6170],{"class":5327},[5295,19254,19194],{"class":5381},[5295,19256,5385],{"class":5338},[5295,19258,5433],{"class":5327},[5295,19260,15088],{"class":5331},[5295,19262,5354],{"class":5338},[5295,19264,5357],{"class":5331},[5295,19266,5588],{"class":5327},[5295,19268,19209],{"class":5360},[5295,19270,13384],{"class":5338},[5295,19272,5433],{"class":5327},[5295,19274,10340],{"class":5327},[5295,19276,19277],{"class":5297,"line":5499},[5295,19278,10059],{"class":5338},[5295,19280,19281,19283,19285,19287,19289,19292,19294,19297,19299,19301,19303,19305],{"class":5297,"line":5504},[5295,19282,8512],{"class":5331},[5295,19284,5354],{"class":5338},[5295,19286,5609],{"class":5360},[5295,19288,5612],{"class":5338},[5295,19290,19291],{"class":5305},"\"[Console] \"",[5295,19293,5612],{"class":5338},[5295,19295,19296],{"class":5360},"text",[5295,19298,5612],{"class":5338},[5295,19300,5641],{"class":5305},[5295,19302,5645],{"class":5644},[5295,19304,5641],{"class":5305},[5295,19306,5364],{"class":5338},[5295,19308,19309],{"class":5297,"line":5509},[5295,19310,8546],{"class":5338},[5295,19312,19313],{"class":5297,"line":5535},[5295,19314,5475],{"class":5338},[5295,19316,19317],{"class":5297,"line":5540},[5295,19318,5321],{"emptyLinePlaceholder":5320},[5295,19320,19321,19323,19326,19328,19330],{"class":5297,"line":5562},[5295,19322,5328],{"class":5327},[5295,19324,19325],{"class":5331}," FilePrinter",[5295,19327,5491],{"class":5338},[5295,19329,5494],{"class":5327},[5295,19331,19168],{"class":5331},[5295,19333,19334],{"class":5297,"line":5567},[5295,19335,5339],{"class":5338},[5295,19337,19338],{"class":5297,"line":5572},[5295,19339,12995],{"class":5327},[5295,19341,19342,19344,19346,19348,19351],{"class":5297,"line":5597},[5295,19343,5351],{"class":5331},[5295,19345,5354],{"class":5338},[5295,19347,5357],{"class":5331},[5295,19349,19350],{"class":5360}," filename",[5295,19352,5364],{"class":5338},[5295,19354,19355],{"class":5297,"line":5602},[5295,19356,5321],{"emptyLinePlaceholder":5320},[5295,19358,19359],{"class":5297,"line":5652},[5295,19360,5375],{"class":5327},[5295,19362,19363,19366,19368,19370,19372,19374,19377,19379,19382,19384,19387],{"class":5297,"line":5658},[5295,19364,19365],{"class":5381},"    FilePrinter",[5295,19367,5385],{"class":5338},[5295,19369,5388],{"class":5331},[5295,19371,5354],{"class":5338},[5295,19373,5357],{"class":5331},[5295,19375,19376],{"class":5360}," fname",[5295,19378,5398],{"class":5338},[5295,19380,19381],{"class":5381},"filename",[5295,19383,5385],{"class":5338},[5295,19385,19386],{"class":5360},"fname",[5295,19388,5409],{"class":5338},[5295,19390,19391],{"class":5297,"line":5663},[5295,19392,5415],{"class":5338},[5295,19394,19395,19397,19399,19401,19403,19405,19407,19409,19411,19413,19415,19417],{"class":5297,"line":5675},[5295,19396,6170],{"class":5327},[5295,19398,19194],{"class":5381},[5295,19400,5385],{"class":5338},[5295,19402,5433],{"class":5327},[5295,19404,15088],{"class":5331},[5295,19406,5354],{"class":5338},[5295,19408,5357],{"class":5331},[5295,19410,5588],{"class":5327},[5295,19412,19209],{"class":5360},[5295,19414,13384],{"class":5338},[5295,19416,5433],{"class":5327},[5295,19418,10340],{"class":5327},[5295,19420,19421],{"class":5297,"line":5680},[5295,19422,10059],{"class":5338},[5295,19424,19425,19427,19429,19432,19435,19437,19439,19441,19443,19445,19448,19450,19453],{"class":5297,"line":5696},[5295,19426,8512],{"class":5331},[5295,19428,5354],{"class":5338},[5295,19430,19431],{"class":5331},"ofstream",[5295,19433,19434],{"class":5381}," file",[5295,19436,5385],{"class":5338},[5295,19438,19381],{"class":5360},[5295,19440,7913],{"class":5338},[5295,19442,5388],{"class":5331},[5295,19444,5354],{"class":5338},[5295,19446,19447],{"class":5331},"ios",[5295,19449,5354],{"class":5338},[5295,19451,19452],{"class":5360},"app",[5295,19454,5693],{"class":5338},[5295,19456,19457,19459,19461,19464,19466,19469],{"class":5297,"line":5714},[5295,19458,16008],{"class":5301},[5295,19460,5805],{"class":5338},[5295,19462,19463],{"class":5360},"file",[5295,19465,5618],{"class":5338},[5295,19467,19468],{"class":5381},"is_open",[5295,19470,19471],{"class":5338},"()) {\n",[5295,19473,19474,19477,19479,19481,19483,19485,19487,19489],{"class":5297,"line":5719},[5295,19475,19476],{"class":5360},"            file",[5295,19478,5612],{"class":5338},[5295,19480,19296],{"class":5360},[5295,19482,5612],{"class":5338},[5295,19484,5641],{"class":5305},[5295,19486,5645],{"class":5644},[5295,19488,5641],{"class":5305},[5295,19490,5364],{"class":5338},[5295,19492,19493,19495,19497,19499,19501,19504,19506,19508,19510,19512,19514,19516],{"class":5297,"line":5731},[5295,19494,16968],{"class":5331},[5295,19496,5354],{"class":5338},[5295,19498,5609],{"class":5360},[5295,19500,5612],{"class":5338},[5295,19502,19503],{"class":5305},"\"[File] Записано у \"",[5295,19505,5612],{"class":5338},[5295,19507,19381],{"class":5360},[5295,19509,5612],{"class":5338},[5295,19511,5641],{"class":5305},[5295,19513,5645],{"class":5644},[5295,19515,5641],{"class":5305},[5295,19517,5364],{"class":5338},[5295,19519,19520],{"class":5297,"line":6354},[5295,19521,16044],{"class":5338},[5295,19523,19524],{"class":5297,"line":6387},[5295,19525,8546],{"class":5338},[5295,19527,19528],{"class":5297,"line":6392},[5295,19529,5475],{"class":5338},[5295,19531,19532],{"class":5297,"line":6401},[5295,19533,5321],{"emptyLinePlaceholder":5320},[5295,19535,19536,19538,19541,19543,19545],{"class":5297,"line":9032},[5295,19537,5328],{"class":5327},[5295,19539,19540],{"class":5331}," UpperCasePrinter",[5295,19542,5491],{"class":5338},[5295,19544,5494],{"class":5327},[5295,19546,19168],{"class":5331},[5295,19548,19549],{"class":5297,"line":9045},[5295,19550,5339],{"class":5338},[5295,19552,19553],{"class":5297,"line":9059},[5295,19554,5375],{"class":5327},[5295,19556,19557,19559,19561,19563,19565,19567,19569,19571,19573,19575,19577,19579],{"class":5297,"line":9073},[5295,19558,6170],{"class":5327},[5295,19560,19194],{"class":5381},[5295,19562,5385],{"class":5338},[5295,19564,5433],{"class":5327},[5295,19566,15088],{"class":5331},[5295,19568,5354],{"class":5338},[5295,19570,5357],{"class":5331},[5295,19572,5588],{"class":5327},[5295,19574,19209],{"class":5360},[5295,19576,13384],{"class":5338},[5295,19578,5433],{"class":5327},[5295,19580,10340],{"class":5327},[5295,19582,19583],{"class":5297,"line":9078},[5295,19584,10059],{"class":5338},[5295,19586,19587,19589,19591,19593,19596,19598,19600],{"class":5297,"line":9084},[5295,19588,8512],{"class":5331},[5295,19590,5354],{"class":5338},[5295,19592,5357],{"class":5331},[5295,19594,19595],{"class":5360}," upper",[5295,19597,6276],{"class":5338},[5295,19599,19296],{"class":5360},[5295,19601,5364],{"class":5338},[5295,19603,19604,19606,19608,19611,19613,19616,19618,19620,19622,19624,19626,19628,19630,19632,19634,19636,19639,19642],{"class":5297,"line":9121},[5295,19605,8512],{"class":5331},[5295,19607,5354],{"class":5338},[5295,19609,19610],{"class":5381},"transform",[5295,19612,5385],{"class":5338},[5295,19614,19615],{"class":5360},"upper",[5295,19617,5618],{"class":5338},[5295,19619,16694],{"class":5381},[5295,19621,16697],{"class":5338},[5295,19623,19615],{"class":5360},[5295,19625,5618],{"class":5338},[5295,19627,16704],{"class":5381},[5295,19629,16697],{"class":5338},[5295,19631,19615],{"class":5360},[5295,19633,5618],{"class":5338},[5295,19635,16694],{"class":5381},[5295,19637,19638],{"class":5338},"(), ::",[5295,19640,19641],{"class":5360},"toupper",[5295,19643,5693],{"class":5338},[5295,19645,19646,19648,19650,19652,19654,19657,19659,19661,19663,19665,19667,19669],{"class":5297,"line":9126},[5295,19647,8512],{"class":5331},[5295,19649,5354],{"class":5338},[5295,19651,5609],{"class":5360},[5295,19653,5612],{"class":5338},[5295,19655,19656],{"class":5305},"\"[UpperCase] \"",[5295,19658,5612],{"class":5338},[5295,19660,19615],{"class":5360},[5295,19662,5612],{"class":5338},[5295,19664,5641],{"class":5305},[5295,19666,5645],{"class":5644},[5295,19668,5641],{"class":5305},[5295,19670,5364],{"class":5338},[5295,19672,19673],{"class":5297,"line":9146},[5295,19674,8546],{"class":5338},[5295,19676,19677],{"class":5297,"line":9176},[5295,19678,5475],{"class":5338},[5295,19680,19681],{"class":5297,"line":9207},[5295,19682,5321],{"emptyLinePlaceholder":5320},[5295,19684,19685,19687,19690,19692,19694,19697,19699,19702,19704,19706,19708,19710,19712,19714,19717],{"class":5297,"line":9237},[5295,19686,5575],{"class":5327},[5295,19688,19689],{"class":5381}," sendDocument",[5295,19691,5385],{"class":5338},[5295,19693,5433],{"class":5327},[5295,19695,19696],{"class":5331}," Printer",[5295,19698,5588],{"class":5327},[5295,19700,19701],{"class":5360}," printer",[5295,19703,7913],{"class":5338},[5295,19705,5433],{"class":5327},[5295,19707,15088],{"class":5331},[5295,19709,5354],{"class":5338},[5295,19711,5357],{"class":5331},[5295,19713,5588],{"class":5327},[5295,19715,19716],{"class":5360}," doc",[5295,19718,5594],{"class":5338},[5295,19720,19721],{"class":5297,"line":9242},[5295,19722,5339],{"class":5338},[5295,19724,19725,19728,19730,19733,19735,19738],{"class":5297,"line":9247},[5295,19726,19727],{"class":5360},"    printer",[5295,19729,5618],{"class":5338},[5295,19731,19732],{"class":5381},"print",[5295,19734,5385],{"class":5338},[5295,19736,19737],{"class":5360},"doc",[5295,19739,5693],{"class":5338},[5295,19741,19742],{"class":5297,"line":9256},[5295,19743,5655],{"class":5338},[5295,19745,19746],{"class":5297,"line":13229},[5295,19747,5321],{"emptyLinePlaceholder":5320},[5295,19749,19750,19752,19754],{"class":5297,"line":13243},[5295,19751,5666],{"class":5327},[5295,19753,5669],{"class":5381},[5295,19755,5672],{"class":5338},[5295,19757,19758],{"class":5297,"line":13248},[5295,19759,5339],{"class":5338},[5295,19761,19762,19765,19768],{"class":5297,"line":13253},[5295,19763,19764],{"class":5331},"    ConsolePrinter",[5295,19766,19767],{"class":5360}," console",[5295,19769,5364],{"class":5338},[5295,19771,19772,19774,19776,19778,19781],{"class":5297,"line":13285},[5295,19773,19365],{"class":5331},[5295,19775,19434],{"class":5381},[5295,19777,5385],{"class":5338},[5295,19779,19780],{"class":5305},"\"output.txt\"",[5295,19782,5693],{"class":5338},[5295,19784,19785,19788,19790],{"class":5297,"line":13320},[5295,19786,19787],{"class":5331},"    UpperCasePrinter",[5295,19789,19595],{"class":5360},[5295,19791,5364],{"class":5338},[5295,19793,19794],{"class":5297,"line":13325},[5295,19795,5415],{"class":5338},[5295,19797,19798,19800,19802,19804,19807,19809,19812],{"class":5297,"line":13336},[5295,19799,5351],{"class":5331},[5295,19801,5354],{"class":5338},[5295,19803,5357],{"class":5331},[5295,19805,19806],{"class":5360}," document",[5295,19808,6276],{"class":5338},[5295,19810,19811],{"class":5305},"\"Важливий документ для друку\"",[5295,19813,5364],{"class":5338},[5295,19815,19816],{"class":5297,"line":13341},[5295,19817,5415],{"class":5338},[5295,19819,19820,19823,19825,19828,19830,19833],{"class":5297,"line":13361},[5295,19821,19822],{"class":5381},"    sendDocument",[5295,19824,5385],{"class":5338},[5295,19826,19827],{"class":5360},"console",[5295,19829,7913],{"class":5338},[5295,19831,19832],{"class":5360},"document",[5295,19834,5693],{"class":5338},[5295,19836,19837,19839,19841,19843,19845,19847],{"class":5297,"line":13366},[5295,19838,19822],{"class":5381},[5295,19840,5385],{"class":5338},[5295,19842,19463],{"class":5360},[5295,19844,7913],{"class":5338},[5295,19846,19832],{"class":5360},[5295,19848,5693],{"class":5338},[5295,19850,19851,19853,19855,19857,19859,19861],{"class":5297,"line":13371},[5295,19852,19822],{"class":5381},[5295,19854,5385],{"class":5338},[5295,19856,19615],{"class":5360},[5295,19858,7913],{"class":5338},[5295,19860,19832],{"class":5360},[5295,19862,5693],{"class":5338},[5295,19864,19865],{"class":5297,"line":13389},[5295,19866,5415],{"class":5338},[5295,19868,19869,19871,19873],{"class":5297,"line":13394},[5295,19870,5722],{"class":5301},[5295,19872,5726],{"class":5725},[5295,19874,5364],{"class":5338},[5295,19876,19877],{"class":5297,"line":13407},[5295,19878,5655],{"class":5338},[5761,19880,19882,19886,19890],{"title":19881},".\u002FPolymorphicPrinter",[5765,19883,19885],{"className":19884},[5297],"[Console] Важливий документ для друку",[5765,19887,19889],{"className":19888},[5297],"[File] Записано у output.txt",[5765,19891,19893],{"className":19892},[5297],"[UpperCase] ВАЖЛИВИЙ ДОКУМЕНТ ДЛЯ ДРУКУ",[19895,19896,19897],"style",{},"html pre.shiki code .s8xlr, html code.shiki .s8xlr{--shiki-light:#AF00DB;--shiki-default:#C586C0;--shiki-dark:#C586C0}html pre.shiki code .sbdoH, html code.shiki .sbdoH{--shiki-light:#A31515;--shiki-default:#CE9178;--shiki-dark:#CE9178}html pre.shiki code .su1O8, html code.shiki .su1O8{--shiki-light:#0000FF;--shiki-default:#569CD6;--shiki-dark:#569CD6}html pre.shiki code .sN1BT, html code.shiki .sN1BT{--shiki-light:#267F99;--shiki-default:#4EC9B0;--shiki-dark:#4EC9B0}html pre.shiki code .sHH4Y, html code.shiki .sHH4Y{--shiki-light:#000000;--shiki-default:#D4D4D4;--shiki-dark:#D4D4D4}html pre.shiki code .siwwj, html code.shiki .siwwj{--shiki-light:#001080;--shiki-default:#9CDCFE;--shiki-dark:#9CDCFE}html pre.shiki code .s8Opu, html code.shiki .s8Opu{--shiki-light:#795E26;--shiki-default:#DCDCAA;--shiki-dark:#DCDCAA}html pre.shiki code .sjcCO, html code.shiki .sjcCO{--shiki-light:#EE0000;--shiki-default:#D7BA7D;--shiki-dark:#D7BA7D}html pre.shiki code .spJ8K, html code.shiki .spJ8K{--shiki-light:#008000;--shiki-default:#6A9955;--shiki-dark:#6A9955}html pre.shiki code .sJj4R, html code.shiki .sJj4R{--shiki-light:#098658;--shiki-default:#B5CEA8;--shiki-dark:#B5CEA8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":5291,"searchDepth":5309,"depth":5309,"links":19899},[19900,19901,19905,19910,19915,19919,19924,19928,19932,19936,19940,19941,19945,19949,19952,19957,19961,19965,19971,19972,19973],{"id":5254,"depth":5309,"text":5255},{"id":5926,"depth":5309,"text":5927,"children":19902},[19903,19904],{"id":5931,"depth":5317,"text":5932},{"id":6456,"depth":5317,"text":6457},{"id":6622,"depth":5309,"text":6623,"children":19906},[19907,19908,19909],{"id":6626,"depth":5317,"text":6627},{"id":7105,"depth":5317,"text":7106},{"id":7279,"depth":5317,"text":7280},{"id":7304,"depth":5309,"text":19911,"children":19912},"Ключове слово virtual: активація динамічного зв'язування",[19913,19914],{"id":7311,"depth":5317,"text":7312},{"id":7510,"depth":5317,"text":7511},{"id":7883,"depth":5309,"text":7884,"children":19916},[19917,19918],{"id":7887,"depth":5317,"text":7888},{"id":8139,"depth":5317,"text":8140},{"id":8368,"depth":5309,"text":8369,"children":19920},[19921,19922,19923],{"id":8372,"depth":5317,"text":8373},{"id":8635,"depth":5317,"text":8636},{"id":9310,"depth":5317,"text":9311},{"id":9600,"depth":5309,"text":9601,"children":19925},[19926,19927],{"id":9604,"depth":5317,"text":9605},{"id":9871,"depth":5317,"text":9872},{"id":10000,"depth":5309,"text":10001,"children":19929},[19930,19931],{"id":10004,"depth":5317,"text":10005},{"id":10221,"depth":5317,"text":10222},{"id":10489,"depth":5309,"text":10490,"children":19933},[19934,19935],{"id":10493,"depth":5317,"text":10494},{"id":10770,"depth":5317,"text":10771},{"id":10849,"depth":5309,"text":10850,"children":19937},[19938,19939],{"id":10853,"depth":5317,"text":10854},{"id":10911,"depth":5317,"text":10912},{"id":10967,"depth":5309,"text":10968},{"id":11147,"depth":5309,"text":11148,"children":19942},[19943,19944],{"id":11151,"depth":5317,"text":11152},{"id":11439,"depth":5317,"text":11440},{"id":11904,"depth":5309,"text":11905,"children":19946},[19947,19948],{"id":11908,"depth":5317,"text":11909},{"id":12323,"depth":5317,"text":12324},{"id":12645,"depth":5309,"text":12646,"children":19950},[19951],{"id":12649,"depth":5317,"text":12650},{"id":14313,"depth":5309,"text":19953,"children":19954},"Віртуальність та const: збіг сигнатури є обов'язковим",[19955,19956],{"id":14320,"depth":5317,"text":14321},{"id":14605,"depth":5317,"text":14606},{"id":14963,"depth":5309,"text":14964,"children":19958},[19959,19960],{"id":14967,"depth":5317,"text":14968},{"id":15020,"depth":5317,"text":15021},{"id":15231,"depth":5309,"text":15232,"children":19962},[19963,19964],{"id":15235,"depth":5317,"text":15236},{"id":16223,"depth":5317,"text":16224},{"id":17278,"depth":5309,"text":17279,"children":19966},[19967,19968,19969,19970],{"id":17282,"depth":5317,"text":17283},{"id":17462,"depth":5317,"text":17463},{"id":17564,"depth":5317,"text":17565},{"id":17766,"depth":5317,"text":17767},{"id":17970,"depth":5309,"text":17971},{"id":18069,"depth":5309,"text":18070},{"id":18236,"depth":5309,"text":18237},"Як покажчики та посилання на базовий клас можуть працювати з об'єктами похідних класів. Обмеження статичного зв'язування. Ключове слово virtual для активації динамічного поліморфізму. Обробка гетерогенних колекцій через єдиний інтерфейс. Третій стовп ООП — поліморфізм.","md",null,{},{"title":2013,"description":19974},"rQOnABrPZVJQWLYZ9fsCUzBX-M44HAPA5CDMumxI7zI",[19981,19983],{"title":2009,"path":2010,"stem":2011,"description":19982,"children":-1},"Як клас може успадковувати від кількох базових класів одночасно. Синтаксис множинного наслідування, порядок виклику конструкторів. Проблема діамантового наслідування (ромб смерті) та її вирішення через віртуальні базові класи. Чому множинне наслідування варто використовувати обережно.",{"title":2017,"path":2018,"stem":2019,"description":19984,"children":-1},"Специфікатор override для контролю правильності перевизначення методів. Специфікатор final для заборони подальшого наслідування. Смертельна небезпека невіртуальних деструкторів при видаленні поліморфних об'єктів. Фундаментальне правило віртуальних деструкторів у базових класах.",1792589352600]