From C++98 class design through C++17 features, template metaprogramming, STL internals, multithreading, and production GUI development with Qt — in one course.
C++ specific depth you won’t find in the market.
You won’t just learn that virtual functions enable polymorphism — you’ll see the vtable structure, the hidden vptr member, the adjustor thunk, and how the runtime resolves calls through base class pointers. Every object is mapped to its actual memory layout.
We map every C++ construct — classes, objects, static members, virtual functions, templates — to the virtual address space of a running process. Text section, data, BSS, stack, heap, memory-mapped regions. You see where your code actually lives.
Beyond function and class templates — you’ll learn traits, policy classes, SFINAE, expression templates, recursive instantiation, partial specialisation, and the compile-time computation model. The full depth of generic programming.
Not a “modern C++” crash course. We start with C++98 class design, build through C++11 move semantics and variadic templates, cover C++14 generic lambdas, and arrive at C++17 structured bindings, fold expressions, and CTAD. You understand the evolution, not just the latest syntax.
Not a toy example. You build real applications — dialogs, main windows with menus and toolbars, custom widgets, layout management, event processing, MDI interfaces. Signals and slots architecture understood at the mechanism level.
Beyond std::thread basics — you learn the C++ memory model, atomic operations, lock-based and lock-free concurrent data structures, and how to design concurrent code that is correct by construction, not by accident.
Six phases, each building on the last.
From C’s limitations to C++ classes. Data abstraction, information hiding, constructors, operator overloading, copy control, memory management. The foundation.
Inheritance, polymorphism, virtual functions, pure abstract classes, interface inheritance, vtable internals. The design principles that make large systems possible.
Function templates, class templates, specialisation, traits, policy classes, expression templates, metaprogramming. The compile-time dimension of C++.
Move semantics, rvalue references, variadic templates, lambdas, `constexpr`, structured bindings, fold expressions, CTAD. Every feature explained through the type system.
Sequential and associative containers, iterators, generic algorithms, allocators, streams. Then: threading, synchronisation, atomics, lock-free design.
Signals and slots, dialogs, main windows, custom widgets, layout management, event processing. Building real desktop applications.
This is the full course content across ~65 weekend sessions.
From C’s limitations to C++ class design — constructors, copy control, operator overloading, and every construct mapped to the virtual address space of a running process.
private, public, and protected keywordsconst; semantic differences of const between C and C++; const and pointers: pointer to const, const pointer, const pointer to const — use cases for each; the mutable keyword; the inline keyword; the extern keywordconst with the deeper understanding of build process and memory layoutHow hierarchical design enables reuse — virtual functions, interface inheritance, pure abstract classes, and the vtable mechanism that makes runtime dispatch possible.
From function templates to expression templates — type deduction, specialisation, traits, policy classes, and compile-time computation through recursive instantiation.
inline functions — precompiled headers — debugging templatesImplicit conversions, the four named casts, and how RTTI interacts with inheritance hierarchies — understanding what the compiler does and what the runtime resolves.
static_cast — compile-time checked conversions between related typesdynamic_cast — runtime-checked downcasting in polymorphic hierarchiesreinterpret_cast — low-level bit reinterpretationconst_cast — adding or removing const qualificationStructured error handling from C’s setjmp to C++ exceptions — stack unwinding, exception class hierarchies, and namespace design for large codebases.
setjmp() and longjmp() — limitations and dangersauto_ptr and its successorsThe ownership revolution — rvalue references, move constructors, unique_ptr, shared_ptr, lambdas, auto, constexpr, and the features that redefined how C++ is written.
std::unique_ptr — exclusive ownership of a dynamically allocated resource, zero overhead over raw pointersstd::shared_ptr — shared ownership with reference counting — control block layout and overheadstd::weak_ptr — non-owning observer of a shared resource — breaking circular referencesdecltype — querying the type of an expressiontypedefconstexpr — marking functions and variables for compile-time evaluationstatic_assert — compile-time assertions for type properties and constraintsstd::function — type-erased callable wrapper for functions, lambdas, and function objectsstd::bind — partial application and argument reordering for callable objectsstd::initializer_listnullptr — a type-safe null pointer constant replacing NULLGeneric lambdas, return type deduction, decltype(auto), and the relaxation of constexpr — small changes with disproportionate impact on real-world code.
if constexpr, CTAD, fold expressions, std::optional, std::variant, std::string_view — the features that make modern C++ expressive without sacrificing type safety.
if constexpr — compile-time branching that discards the untaken path entirelystd::optional — nullable value types without resorting to pointers or sentinel valuesstd::variant — type-safe discriminated union replacing raw unions and the visitor patternstd::any — type-safe alternative to void* for holding values of arbitrary typestd::string_view — non-owning reference to a character sequence, avoiding unnecessary copiesSequential, associative, and unordered containers — iterator architecture, generic algorithms, streams, and the allocator model that controls how memory is managed underneath.
make_pair()std::array — fixed-size contiguous containerstd::vector — dynamic contiguous storage with amortised growthstd::deque — double-ended queue with O(1) insertion at both endsstd::list — doubly-linked list with O(1) splice and insertionstd::forward_list — singly-linked list optimised for minimal overheadstd::string — the full interface for string manipulationstd::stack and std::queuestd::map — ordered key-value pairs with unique keysstd::multimap — ordered key-value pairs allowing duplicate keysstd::set — ordered unique elementsstd::multiset — ordered elements allowing duplicatesstd::unordered_map — hash-based key-value pairs with O(1) average lookupstd::unordered_set — hash-based unique elements with O(1) average lookupstd::unordered_multimap and std::unordered_multiset — hash-based containers allowing duplicatesconst iterators — reverse iteratorsiostream — formatted and unformatted I/Ofstream — reading and writing filesstringstream — in-memory formatting and parsingBeyond std::thread — the C++ memory model, happens-before relationships, atomic operations, and designing concurrent data structures that are correct by construction.
Signals and slots, dialogs, main windows, custom widgets, layout management, and event processing — building real desktop applications, not toy examples.
QDialog — building custom dialog windowsQMainWindow — the central application windowQWidget — building widgets from scratchThis course does not teach design patterns as an isolated academic exercise. Instead, patterns emerge naturally from the material — some are built from scratch as part of learning the underlying mechanisms, others are encountered through the libraries and frameworks you use. Both deepen your understanding of software design.
Restricting a class to a single instance — controlling global access through a static interface.
Encapsulating object creation — decoupling the client from the concrete class being instantiated.
Returning callable objects configured at creation time — producing specialised behaviour on demand.
Providing a simplified interface to a complex subsystem — hiding internal complexity from the client.
Sequential access to elements of an aggregate without exposing the underlying representation.
Tying resource lifetime to object lifetime — the defining C++ idiom. Built through copy control, destructors, and smart pointer understanding.
Shallow copying with reference counting — multiple handles sharing one implementation body. Built from scratch in the copy control section.
Creating new objects by cloning existing ones — implemented through deep copy constructors you write yourself.
Defining an algorithm skeleton in a base class with virtual hooks that derived classes `override` — built through the “`override` for extension” pattern.
Pointer to Implementation — hiding implementation details from header files. Built through interface inheritance and information-hiding exercises.
Configuring class behaviour through template parameters — traits and policy classes implemented from scratch in the templates module.
The Curiously Recurring Template Pattern — static polymorphism through class Derived : `public` Base<Derived>. Built in the parameterized virtuality section.
Qt’s signals and slots — one object emits a signal, multiple connected objects respond. The mechanism is used, not reimplemented.
Passing lambdas, function objects, and comparators to STL algorithms — changing an algorithm’s behaviour at runtime through a callable.
Encapsulating a callable as a storable, passable object — encountered through `std::function` and std::bind.
`std::stack` and `std::queue` — the STL literally calls them container adaptors. They wrap an underlying container and restrict the interface.
Smart pointers control access to a raw resource, intercept operations, and manage lifetime on the client’s behalf.
`std::variant` with `std::visit` in C++17 — the visitor pattern implemented through the type system.
Qt’s widget hierarchy — parent widgets containing child widgets, each responding to the same interface for painting, resizing, and event handling.
`std::function` and `std::any` — hiding concrete types behind a uniform runtime interface.
You should be comfortable with the following topics in C before joining this course. These are not taught in the course — they are assumed.
Batch 26 starts 9th May 2026. First week is open for all.