AlgoMaster Logo

inheritance basics

Last Updated: January 3, 2026

8 min read

Inheritance is one of the cornerstones of object-oriented programming in C++. It allows us to create new classes based on existing ones, promoting code reuse and establishing a natural hierarchy among classes.

But there’s more to inheritance than just reusing code; it’s about extending functionality in a clear and organized way.

Let’s dive into the basics of inheritance, exploring how it works in C++, its benefits, and some practical examples that illustrate its power.

What Is Inheritance?

At its core, inheritance allows one class (the derived class) to inherit attributes and methods from another class (the base class). This relationship creates a hierarchy where the derived class can utilize and extend the functionality of the base class.

Imagine a simple biological analogy: if you have a Animal class, you might have specific classes like Dog or Cat that inherit from it. Both Dog and Cat share common traits (like the ability to eat or move) but can also have their unique characteristics (like barking for Dog and meowing for Cat).

Here's a straightforward example to illustrate:

In this example, Dog inherits the eat method from Animal, allowing us to call it directly on an instance of Dog. This simple relationship is foundational to understanding how inheritance works in C++.

Benefits of Inheritance

So why should we use inheritance? Here are some key benefits:

  1. Code Reusability: By inheriting from existing classes, you avoid rewriting code. If Dog and Cat both need an eat method, you only need to implement it once in the Animal class.
  2. Organized Structure: Inheritance helps organize code into a hierarchy, making it easier to understand relationships and functionalities. This structure can reflect real-world relationships, improving readability.
  3. Polymorphism: Inheritance sets the stage for polymorphism, allowing methods to be overridden and providing a way to treat different derived classes as instances of a common base class.
  4. Extensibility: As requirements change, you can extend existing classes without modifying them. For instance, if we wanted to add a Dog class with specific behaviors, we could do so without altering the Animal class.

Let’s look at a more complex example that showcases these benefits:

In this example, we define a base class Animal with a virtual sound method. The derived classes Cat and Dog override this method to provide specific sounds. The makeSound function demonstrates polymorphism by calling the appropriate method for each derived class, even though they're treated as Animal pointers.

The Syntax of Inheritance

While the concept is straightforward, it's essential to understand the syntax involved in defining classes and implementing inheritance in C++. The basic structure involves using the : symbol followed by an access specifier (public, protected, or private) and the base class name.

Here’s a breakdown:

Access Specifiers

  • Public Inheritance: This is the most common type, where public and protected members of the base class remain public and protected in the derived class.
  • Protected Inheritance: Here, public and protected members of the base class become protected in the derived class. This is less common and usually reserved for specialized cases.
  • Private Inheritance: In this case, all members of the base class become private in the derived class, making them inaccessible to anything outside the derived class.

Let’s illustrate this with a quick example:

In this example, Derived inherits from Base publicly. As a result, it can access the publicMethod and protectedMethod, but not privateMethod. Understanding these access levels is crucial for designing effective class hierarchies.

Overriding and Hiding Methods

When you inherit from a base class, the derived class can modify or replace methods from the base class. This is known as overriding. If a derived class has a method with the same name as a base class method, the derived class's method is called instead of the base class's version.

Here’s how overriding works in practice:

In this snippet, the show method in the Derived class overrides the method in Base. When we call b->show(), the derived version is executed. This is a critical feature of polymorphism, allowing us to substitute derived classes for base classes seamlessly.

Method Hiding

It's also worth mentioning method hiding, which occurs when a derived class defines a method that has the same name as a method in the base class but does not override it (typically because the base method is not virtual). In this case, the base class method is hidden, not overridden.

Here, the display method in Derived hides the display method in Base. You can call the base method explicitly using Base::display().

Real-World Applications of Inheritance

Now that we understand the mechanics of inheritance, let's look at some real-world applications where inheritance can shine.

GUI Frameworks

In graphical user interface (GUI) frameworks, inheritance allows for creating a hierarchy of components. For example, a Widget class could be the base for Button, TextBox, and Label classes. Each of these components can inherit common properties and methods from Widget while implementing their specific behavior.

Game Development

In game development, inheritance is invaluable. A base class like GameObject could define common attributes such as position and velocity. Derived classes such as Player, Enemy, and Weapon can inherit these properties and add specific behaviors, making it easier to manage various game entities.

Software Libraries

When building software libraries, inheritance promotes extensibility and maintainability. If you create a library with a base Shape class, you can derive classes like Circle, Square, and Triangle. Each shape can implement its own methods for calculating area or perimeter, while still benefiting from the common interface defined in Shape.

Now that you understand the basics of inheritance, you are ready to explore the different types of inheritance available in C++.

In the next chapter, we will look at how these types can be effectively used to create more complex class hierarchies, ensuring your designs are both flexible and powerful.