0% found this document useful (0 votes)
5 views

Polymorph is m

Polymorphism refers to the ability of a message to be displayed in multiple forms, particularly in Object-Oriented Programming. It can be categorized into compile-time polymorphism, achieved through function and operator overloading, and runtime polymorphism, which is realized through function overriding. Examples in C++ demonstrate how functions can behave differently based on parameters or object types, showcasing the flexibility of polymorphism.

Uploaded by

Deepak Dhingan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
5 views

Polymorph is m

Polymorphism refers to the ability of a message to be displayed in multiple forms, particularly in Object-Oriented Programming. It can be categorized into compile-time polymorphism, achieved through function and operator overloading, and runtime polymorphism, which is realized through function overriding. Examples in C++ demonstrate how functions can behave differently based on parameters or object types, showcasing the flexibility of polymorphism.

Uploaded by

Deepak Dhingan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 13

Polymorphism

The word “polymorphism” means having many forms. In simple words, we can
define polymorphism as the ability of a message to be displayed in more than
one form. A real-life example of polymorphism is a person who at the same
time can have different characteristics. A man at the same time is a father, a
husband, and an employee. So the same person exhibits different behaviour in
different situations. This is called polymorphism. Polymorphism is considered
one of the important features of Object-Oriented Programming.

Types of Polymorphism
● Compile-time Polymorphism
● Runtime Polymorphism

1. Compile-Time Polymorphism
This type of polymorphism is achieved by function overloading of operator
overloading.
A. Function Overloading

When there are multiple functions with the same name but different parameters,
then the functions are said to be overloaded, hence this is known as Function
Overloading. Functions can be overloaded by changing the number of
arguments or/and changing the type of arguments. In simple terms, it is a feature
of object-oriented programming providing many functions that have the same
name but distinct parameters when numerous tasks are listed under one function
name. There are certain Rules of Function Overloading that should be followed
while overloading a function.

Below is the C++ program to show function overloading or compile-time


polymorphism:
// C++ program to demonstrate
// function overloading or
// Compile-time Polymorphism
#include <bits/stdc++.h>

using namespace std;


class Geeks {
public:
// Function with 1 int parameter
void func(int x)
{
cout << "value of x is " << x << endl;
}

// Function with same name but


// 1 double parameter
void func(double x)
{
cout << "value of x is " << x << endl;
}

// Function with same name and


// 2 int parameters
void func(int x, int y)
{
cout << "value of x and y is " << x << ", " << y
<< endl;
}
};

// Driver code
int main()
{
Geeks obj1;

// Function being called depends


// on the parameters passed
// func() is called with int value
obj1.func(7);

// func() is called with double value


obj1.func(9.132);

// func() is called with 2 int values


obj1.func(85, 64);
return 0;
}

Explanation: In the above example, a single function named function func()


acts differently in three different situations, which is a property of
polymorphism.

B. Operator Overloading

C++ has the ability to provide the operators with a special meaning for a data
type, this ability is known as operator overloading. For example, we can make
use of the addition operator (+) for string class to concatenate two strings. We
know that the task of this operator is to add two operands. So a single operator
‘+’, when placed between integer operands, adds them and when placed
between string operands, concatenates them.

C++ provides a special function to change the current functionality of some


operators within its class which is often called operator overloading. Operator
Overloading is the method by which we can change some specific operators’
functions to do different tasks.

Syntax:
Return_Type classname :: operator op(Argument list)
{
Function Body
} // This can be done by declaring the function
Here,
● Return_Type is the value type to be returned to another object.
● operator op is the function where the operator is a keyword.
● op is the operator to be overloaded.

Operator Overloading can be done by using two approaches, i.e.


1. Overloading Unary Operator.

2. Overloading Binary Operator.

// C++ program to overload ++ when used as prefix

#include <iostream>
using namespace std;

class Count {
private:
int value;
public:

// Constructor to initialize count to 5


Count() : value(5) {}

// Overload ++ when used as prefix


void operator ++() {
value = value + 1;
}

void display() {
cout << "Count: " << value << endl;
}
};

int main() {
Count count1;

// Call the "void operator ++()" function


++count1;

count1.display();
return 0;
}

Criteria/Rules to Define the Operator Function


1. In the case of a non-static member function, the binary operator

should have only one argument and the unary should not have an
argument.
2. In the case of a friend function, the binary operator should have only

two arguments and the unary should have only one argument.
3. Operators that cannot be overloaded are .* :: ?:

4. Operators that cannot be overloaded when declaring that function as

friend function are = () [] ->.


5. The operator function must be either a non-static (member function),
global free function or a friend function.

1. Overloading Unary Operator


Let us consider overloading (-) unary operators. In the unary operator function,
no arguments should be passed. It works only with one class object. It is the
overloading of an operator operating on a single operand.
Example: Assume that class Distance takes two member objects i.e. feet and
inches, and creates a function by which the Distance object should decrement
the value of feet and inches by 1 (having a single operand of Distance Type).

1. Overloading the Operator with Member Functions:


// C++ program to show unary
// operator overloading
#include <iostream>
using namespace std;

class Distance {
public:
int feet, inch;

// Constructor to initialize
// the object's value
Distance(int f, int i)
{
this->feet = f;
this->inch = i;
}

// Overloading(-) operator to
// perform decrement operation
// of Distance object
void operator-()
{
feet--;
inch--;
cout << "\nFeet & Inches(Decrement): " <<
feet << "'" << inch;
}
};

// Driver Code
int main()
{
Distance d1(8, 9);

// Use (-) unary operator by


// single operand
-d1;
return 0;
}

1. Overloading the Operator with Friend Functions:


#include <iostream>
using namespace std;

class Number {
private:
int value;

public:
// Constructor
Number(int v) : value(v) {}

// Friend function to overload the unary minus operator


friend void operator-(Number &obj);

// Function to display the value


void display() const {
cout << "Value: " << value << endl;
}
};

// Definition of the friend function


void operator-(Number &obj) {
obj.value = -obj.value; // Negate the value
}

int main() {
Number num(10);

cout << "Before applying unary minus operator:" << endl;


num.display();

// Applying unary minus operator


-num;

cout << "After applying unary minus operator:" << endl;


num.display();

return 0;
}

2. Overloading Binary Operator


In the binary operator overloading function, there should be one argument to be
passed. It is the overloading of an operator operating on two operands. Below is
the C++ program to show the overloading of the binary operator (+) using a
class Distance with two distant objects.

1. Overloading the Operator with Member Functions:


#include <iostream>
using namespace std;

class Number {
private:
int value;
public:
// Constructor
Number(int v) : value(v) {}

// Overloaded binary + operator as a member function


void operator+(const Number &obj) {
this->value += obj.value; // Add obj's value to the current object's value
}

// Function to display the value


void display() const {
cout << "Value: " << value << endl;
}
};

int main() {
Number num1(10), num2(20);

cout << "Before addition:" << endl;


num1.display();
num2.display();

// Adding num2 to num1 using the overloaded + operator


num1 + num2;

cout << "After addition (num1 + num2):" << endl;


num1.display();

return 0;
}

2. Overloading the Operator with Friend Functions:


#include <iostream>
using namespace std;

class Number {
private:
int value;

public:
// Constructor
Number(int v) : value(v) {}

// Friend function to overload the + operator


friend void operator+(Number &obj1, const Number &obj2);

// Function to display the value


void display() const {
cout << "Value: " << value << endl;
}
};

// Definition of the friend function


void operator+(Number &obj1, const Number &obj2) {
obj1.value += obj2.value; // Add obj2's value to obj1's value
}

int main() {
Number num1(10), num2(20);

cout << "Before addition:" << endl;


num1.display();
num2.display();

// Adding num2 to num1 using the overloaded + operator


num1 + num2;

cout << "After addition (num1 + num2):" << endl;


num1.display();

return 0;
}
2. Runtime Polymorphism
This type of polymorphism is achieved by Function Overriding. Late binding
and dynamic polymorphism are other names for runtime polymorphism. The
function call is resolved at runtime in runtime polymorphism. In contrast, with
compile time polymorphism, the compiler determines which function calls to
bind to the object after deducing it at runtime.

C++ Function Overriding

In C++ inheritance, we can have the same function in the base class as well as
its derived classes.
When we call the function using an object of the derived class, the function of
the derived class is executed instead of the one in the base class.
So, different functions are executed depending on the object calling the
function.
Using virtual functions in the base class ensures that the function can be
overridden in these cases.
Thus, virtual functions actually fall under function overriding. For example,

Call to Derived Class Function with the help of Base Class Pointer

#include <iostream>
using namespace std;

class Base {
public:
virtual void print() {
cout << "Base Function" << endl;
}
};

class Derived : public Base {


public:
void print() override {
cout << "Derived Function" << endl;
}
};

int main() {
Derived derived1;

// pointer of Base type that points to derived1


Base* base1 = &derived1;

// calls member function of Derived class


base1->print();

return 0;
}

Call to Base Class Function with the help of Derived Class Object
#include <iostream>
using namespace std;

class Base {
public:
// Base class version of show function
void show() {
cout << "Base class show() called" << endl;
}
};

class Derived : public Base {


public:
// Derived class version of show function (overriding)
void show() {
cout << "Derived class show() called" << endl;
}
};

int main() {
Derived obj;

// Calling the derived class's show function


obj.show();

// Calling the base class's show function using the derived object
obj.Base::show();

return 0;
}

You might also like