25.10 — Dynamic casting

Way back in lesson , we examined the concept of casting, and the use of static_cast to convert variables from one type to another. In this lesson, we’ll continue by examining another type of cast: dynamic_cast. The need for dynamic_cast When dealing with polymorphism, you’ll often encounter cases where you …

25.9 — Object slicing

Let’s go back to an example we looked at previously: #include <iostream> #include <string_view> class Base { protected: int m_value{}; public: Base(int value) : m_value{ value } { } virtual ~Base() = default; virtual std::string_view getName() const { return “Base”; } int getValue() const { return m_value; } }; class …

25.3 — The override and final specifiers, and covariant return types

To address some common challenges with inheritance, C++ has two inheritance-related identifiers: override and final. Note that these identifiers are not keywords — they are normal words that have special meaning only when used in certain contexts. The C++ standard calls them “identifiers with special meaning”, but they are often …

23.5 — Dependencies

So far, we’ve explored 3 types of relationships: composition, aggregation, and association. We’ve saved the simplest one for last: dependencies. In casual conversation, we use the term dependency to indicate that an object is reliant upon another object for a given task. For example, if you break your foot, you …

23.4 — Association

In the previous two lessons, we’ve looked at two types of object composition, composition and aggregation. Object composition is used to model relationships where a complex object is built from one or more simpler objects (parts). In this lesson, we’ll take a look at a weaker type of relationship between …