0% found this document useful (0 votes)
26 views8 pages

460004823 Polymorphism in C

Uploaded by

buffertimeplay
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)
26 views8 pages

460004823 Polymorphism in C

Uploaded by

buffertimeplay
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/ 8

Polymorphism in C++

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.

Real life example of polymorphism, a person at the same time can have different

characteristics. Like a man at the same time is a father, a husband, an employee. So the same

person possesses different behavior in different situations. This is called polymorphism.

Polymorphism is considered as one of the important features of Object Oriented Programming.

In C++ polymorphism is mainly divided into two types:

● Compile time Polymorphism


● Runtime Polymorphism

1. Compile time polymorphism​: This type of polymorphism is achieved by function


overloading or operator overloading.

★ Function Overloading​: When there are multiple functions with same name but
different parameters then these functions are said to be ​overloaded​. Functions
can be overloaded by ​change in number of arguments​ or/and c
​ hange in type of
arguments​.
// C++ program for function overloading

class A
{
public:

void func(int x) // function with 1 int parameter


{
cout << "value of x is " << x << endl;
}

void func(double x) // function with same name but 1 double parameter


{
cout << "value of x is " << x << endl;
}

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

int main() {

A obj1;

// Which function is called will depend on the parameters passed

obj1.func(7); ​// The first 'func' is called

obj1.func(9.132); // The second 'func' is called

obj1.func(85,64); // The third 'func' is called


return 0;
}

Output:
value of x is 7
value of x is 9.132
value of x and y is 85, 64
In the above example, a single function named ​func​ acts differently in three different situations

which is the property of polymorphism.

Three different situations which are showing the property of polymorphism.

★ Operator Overloading​: C++ also provide option to overload operators. For example, we
can make the operator (‘+’) for string class to concatenate two strings. We know that this
is the addition operator whose task is to add two operands. So a single operator ‘+’ when
placed between integer operands , adds them and when placed between string operands,
concatenates them.
Example​: ​// CPP program to illustrate Operator Overloading

class Complex
{
private:
int real, imag;
public:
Complex(int r = 0, int i =0)
{ real = r , imag = i; }

// This is automatically called when '+' is used with between two Complex objects

Complex operator + (Complex const &obj)


{
Complex res;
res.real = real + obj.real;
res.imag = imag + obj.imag;
return res;
}
void print()
{ cout << real << " + i" << imag << endl; }
};
int main()
{
Complex c1(10, 5), c2(2, 4);
Complex c3 = c1 + c2; // An example call to "operator+"
c3.print();
}
Output:
12 + i9
In the above example the operator ‘+’ is overloaded. The operator ‘+’ is an addition operator and
can add two numbers(integers or floating point) but here the operator is made to perform
addition of two imaginary or complex numbers.

2. ​Runtime polymorphism ​: This type of polymorphism is achieved by Function or method


Overriding.
★ Function overriding​ on the other hand occurs when a derived class has a definition for
one of the member functions of the base class. That base function is said to be
overridden​.
// C++ program for function overriding

class base
{
public:
virtual void print ()
{ cout<< "print base class" <<endl; }
void show ()
{ cout<< "show base class" <<endl; }
};
class derived:public base
{
public: //print () is already virtual function in derived class,
void print () //we could also declared as virtual void print ()explicitly
{ cout<< "print derived class" <<endl; }

void show ()
{ cout<< "show derived class" <<endl; }
};
int main()
{
base *bptr;
derived d;
bptr = &d;

bptr->print(); //virtual function, binded at runtime (Runtime polymorphism)

bptr->show(); // Non-virtual function, binded at compile time


return 0;
}
Output:
print derived class
show base class
Virtual Function in C++
A virtual function is a member function which is declared within a base class and is

re-defined(Overriden) by a derived class. When you refer to a derived class object using a

pointer or a reference to the base class, you can call a virtual function for that object and

execute the derived class’s version of the function.

● Virtual functions ensure that the correct function is called for an object, regardless
of the type of reference (or pointer) used for function call.
● They are mainly used to achieve Runtime polymorphism
● Functions are declared with a v
​ irtual ​keyword in base class.
● The resolving of function call is done at Run-time.

Rules for Virtual Functions

1. Virtual functions cannot be static and also cannot be a friend function of another
class.
2. Virtual functions should be accessed using pointer or reference of base class type
to achieve run time polymorphism.
3. The prototype of virtual functions should be same in base as well as derived class.
4. They are always defined in base class and overridden in derived class. It is not
mandatory for derived class to override (or re-define the virtual function), in that
case base class version of function is used.
5. A class may have virtual destructor but it cannot have a virtual constructor.
Compile-time(early binding) VS run-time(late binding) behavior of Virtual Functions

Consider the following simple program showing run-time behavior of virtual functions.

// CPP program to illustrate concept of Virtual Functions

class base {
public:
virtual void print()
{
cout << "print base class" << endl;
}
void show()
{
cout << "show base class" << endl;
}
};

class derived : public base {


public:
void print()
{
cout << "print derived class" << endl;
}
void show()
{
cout << "show derived class" << endl;
}
};
int main()
{
base* bptr;
derived d;
bptr = &d;

bptr->print(); // virtual function, binded at runtime

bptr->show(); // Non-virtual function, binded at compile time


}
Output:
print derived class
show base class
Explanation:​ Runtime polymorphism is achieved only through a pointer (or reference) of base

class type. Also, a base class pointer can point to the objects of base class as well as to the

objects of derived class. In above code, base class pointer ‘bptr’ contains the address of object

‘d’ of derived class.

Late binding(Runtime) is done in accordance with the content of pointer (i.e. location pointed to

by pointer) and Early binding(Compile time) is done according to the type of pointer, since

print() function is declared with virtual keyword so it will be bound at run-time (output is p
​ rint

derived class​ as pointer is pointing to object of derived class ) and show() is non-virtual so it will

be bound during compile time(output is ​show base class​ as pointer is of base type ).

NOTE:​ If we have created a virtual function in the base class and it is being overridden in the

derived class then we don’t need virtual keyword in the derived class, functions are

automatically considered as virtual functions in the derived class.

Virtual Functions and Runtime Polymorphism in C++


The main thing to note about the program is that the derived class’s function is called using a

base class pointer.

The idea is that ​virtual functions​ are called according to the type of the object instance pointed

to or referenced, not according to the type of the pointer or reference.

In other words, virtual functions are resolved late, at runtime.

#include <iostream>
using namespace std;

class Base
{
public:
virtual void show()
{
cout << " In Base \n";
}
};
class Derived : public Base
{
public:
void show()
{
cout << "In Derived \n";
}
};

int main(void)
{
Base* bp = new Derived;

// RUN-TIME POLYMORPHISM
bp->show();

return 0;
}

Output:

In Derived

##What is the use?

Virtual functions allow us to create a list of base class pointers and call methods of any of the

derived classes without even knowing kind of derived class object.

You might also like