Unlocking the Power of Inheritance in Object-Oriented Programming
Inheritance is a fundamental concept in object-oriented programming (OOP) that enables the creation of derived classes from a base class. This powerful feature allows derived classes to inherit characteristics from their base class, making it possible to build complex systems with ease.
The Magic of Shadowing
But what happens when a derived class defines a function with the same name as one in its base class? This phenomenon is known as shadowing, where the derived class’s function takes precedence over the base class’s function. For instance, consider a scenario where we define a print()
function in both a Base
and a Derived
class. When we call the print()
function using an object of the Derived
class, the print()
function of the Derived
class executes, effectively shadowing the print()
function of the Base
class.
Accessing Shadowed Functions
So, how do we access the shadowed function of the base class? The answer lies in using the scope resolution operator ::
. By employing this operator, we can explicitly call the shadowed function from the base class. Alternatively, we can use a pointer of the base class to point to an object of the derived class and then call the function from that pointer.
Real-World Examples
Let’s dive into some practical examples to illustrate these concepts:
Example 1: Shadowing in Action
In this example, we define a print()
function in both the Base
and Derived
classes. When we call the print()
function from a Derived
object, the print()
function of the Derived
class executes, shadowing the print()
function of the Base
class.
Example 2: Accessing Shadowed Functions
Here, we demonstrate how to access the shadowed print()
function of the Base
class using the scope resolution operator ::
.
Example 3: Calling Shadowed Functions from Derived Classes
In this example, we show how to call the shadowed print()
function from the Base
class inside the Derived
class itself.
Example 4: Using Pointers to Access Shadowed Functions
In this final example, we create a pointer of Base
type that points to a Derived
object. When we call the print()
function using this pointer, it calls the print()
function of the Base
class.
The Power of Virtual Functions
To override the base function instead of accessing it, we need to employ virtual functions in the base class. By doing so, we can ensure that the correct function is called based on the object’s type, rather than its declared type.