×

Upcasting and Downcasting in C++

With the help of various examples in the C++ programming language, this section will cover Upcasting and Downcasting. Upcasting and downcasting, on the other hand, are two forms of object typecasting. Consider the Parent and Child classes, which have two types of objects, parent_objct and child_objct, which can be cast into Parent to Child and Child to Parent using C++ programming's Upcasting and Downcasting.

Casting in C++ :

When transforming one type of objects to another, the phrase "casting" is commonly used in programming. It's essentially a "forced conversion", in which you change one type to another manually.

Example :

float x = 7.68;
int y;
 
y = (int)x;

In the above example, we were able to assign a value to y by casting x into an int, despite the fact that y is an int. The float value of x, 7.68 loses all of its digits that are placed after the decimal point and is transformed to an int.

In C++, we may use pointer references to build a "is a" relationship between the parent and child classes. There are two main kinds of casting that may be done:

  • Upcasting
  • Downcasting

Upcasting in C++ :

Upcasting is the process of creating the pointer or reference of the derived class from the pointer or reference of the base class. When compared to downcasting, upcasting is a safer option. It enables public inheritance, which allows a reference to be automatically cast from one class to the other without the need for an explicit typecast. Upcasting creates an is-a relationship between base and derived classes by default.

Base *pntr = &derived_objct; 

The derived class can inherit all of the base class attributes, including data members and the member function, and use the derived class object to run the function, just like a base object.

When a derived class object is provided by the value as a base class object, upcasting can result in object slicing.

Whenever we send out a message to an object that has a virtual member function, the object will perform the proper thing, even if upcasting is used.

Example :

#include <iostream> // std::cout
using namespace std;


class Base 
{
public:
    void baseFunc() 
    {
        cout<<"Base Function!"<<endl;
    }
};


class Derived: public Base 
{
public:
    void derivedFunc()
    {
        cout<<"Derived Function!"<<endl;
    }
};


int main() 
{ 
    Derived dObjct;


//Upcasting – Here, the implicit upcasting is allowed
    Base *bPntr = &dObjct;


    bPntr -> baseFunc();


    return 0; 
}

Output :

Base Function!

Explanation :

In the above example, we explained the concept of upcasting. We used a public base class with a void function called baseFunc(). Then we created a derived class from the public base class having a function called derivedFunc(). Then we used implicit upcasting, using a base pointer bPntr pointing towards the derived object dObjct and resulting in the calling of baseFunc().

Downcasting in C++ :

Downcasting is the opposite of upcasting. Upcasting is the polar opposite of downcasting. It changes the value of a base class pointer to a derived class pointer. Manual downcasting is a requirement. It implies we’ll have to define a type cast explicitly.

The explanation for this limitation is that in most circumstances, the is-a connection is not symmetric. The class member procedures that utilised such data members would not really be applicable to the base class if a derived class added additional data members. It is not as safe to downcast as it is to upcast. A downcast is only safe if the object being referenced at runtime is indeed a derived class object.

Derived *d_pntr = &b_objct;

Example :

#include <iostream> // std::cout
using namespace std;


class Base 
{
public:
    void baseFunc() 
    {
        cout<<"Base Function!"<<endl;
    }
};


class Derived: public Base 
{
public:
    void derivedFunc()
    {
        cout<<"Derived Function!"<<endl;
    }
};


int main() 
{ 
    Base bObjct;


// explicit type casting is required here
    Derived *dPntr = (Derived *) &bObjct;
    dPntr -> derivedFunc();


    return 0; 
}

Output :

Derived Fun

Explanation :

In the above example, we explained the concept of downcasting. We used a public base class with a void function called baseFunc(). Then we created a derived class from the public base class having a function called derivedFunc(). Then we used explicit type casting, using a derived pointer dPntr pointing towards the base object bObjct and resulting in the calling of derivedFunc().


Related Topics

How to Declare Unordered Sets in C++

The implementation of an unordered set using a hash table ensures that the insertion is always randomised by hashing the keys into hash table indices. When we define keys of...

4 minutes read.

C++ Object Class

C++ Object Class Overview: C++ is a high-level programming language and an object-oriented programming language. An object-oriented language always has some properties of classes and objects. In this article, we...

4 minutes read.

C++ Deque

Definition: Deque or the Doubly ended queue is a data structure or operation performed under queue where insertion and deletion are allowed at both ends. A deque is an ordered collection of...

5 minutes read.

C++ Data Abstraction

Object-oriented programming (OOP) provides a number of characteristics that enable programmers to design programmes based on a variety of ideas, reducing errors and increasing program flexibility. The abstraction of data...

7 minutes read.

How to Reverse a String in C++ using Do-While Loop

Strings In C++, a string is an object that represents a group (or sequence) of various characters. Strings are part of the standard string class in C++ (std::string). The characters of...

4 minutes read.

Dynamic _Cast in C++

C++ is one of the most powerful programming languages. We can write object-oriented and structured programming with the help of C++. In this article, we will learn about the dynamic...

3 minutes read.

Factorial of a Number in C++ using while Loop

What is a factorial? The factorial of a number is the product of all the positive numbers less than or equal to n, indicated by n! According to the standard for an...

6 minutes read.

Const Keyword in C++

The const programming language keyword will be covered in this section. The constant value that cannot change during program execution is defined using the const keywords. It implies that once...

9 minutes read.

goto statement in C and C++

goto statement in C and C++ The goto statement is a jump statement, also sometimes referred to as an unconditional jump statement. Within a function, the goto statement can be used...

3 minutes read.

Pointer to Object in C++

What is a pointer? A pointer in C++ is used to point the variable by storing the address of the variable. In C++, to print the address of the variable, we...

4 minutes read.

C++ Continue in Do-while loop

Continue statement: Inside the loop, the continue statement is used to control the loop. C++ utilizes the continue keyword to implement the continue statement, which transfers the program's flow at the start...

4 minutes read.

How to Reverse a String in C++ using While Loop

A while loop or while statement repeats all code of its body as long as a specific condition is satisfied. The loop ends if or when the condition no longer...

6 minutes read.

Reverse a String using Stack C/C++

Reverse the given string using stack. To turn "tutorialandexample" into "elpmaxednalairotut," for instance. Here is a straightforward stack-based technique for reversing strings. Algorithm: 1) Make a stack that is empty. 2) Push each character...

3 minutes read.

C++ File Handling

File handling is a mechanism that manipulates the data stored in files. File handling store output data from the program to external file and read file data to the program. There...

3 minutes read.

fread() Function in C++ Programming

C++ language is used to make high-performance applications that can work efficiently, and it is one of the world's most popular languages. It is an object-oriented and high-level programming language;...

3 minutes read.

Virtual base class in C++

Consider in a C++ program, there are 4 classes named class A, class B, class C, and class D. If class B and class c inherit properties from class A....

3 minutes read.

How to Sort an Array in C++

What is Sorting? Sorting is a process of arranging elements in sequential order, either numerically or alphabetically. The sorting of a numerical array can be accomplished using a variety of algorithms,...

4 minutes read.

C++ Void Pointer

A void pointer is a general purpose pointer that can have an address of any data type but is not related to any data type. Void Pointer Syntax: void *ptr;  We can't...

2 minutes read.

abs() function in C++

In C++, the abs() function returns the absolute value of any integer number. Using this function a negative integer is multiplied by -1 and positive number or zero is returned...

4 minutes read.

C++ Break

In this article, we will discuss the C++ Break statement with its syntax, algorithm, pseudocode, and examples. The C++ break statement also terminates the currently active loop or switch statement immediately....

4 minutes read.