Runtime Polymorphism

Runtime polymorphism occurs when functions are resolved at runtime rather than compile time when a call to an overridden method is resolved dynamically at runtime rather than compile time. It's also known as late binding or dynamic binding.

Runtime polymorphism is achieved using a combination of function overriding and virtual functions.



Function Overriding without Virtual keyword

If we do not use the virtual keyword, function overriding still happens, but it does not achieve runtime polymorphism. Instead, early binding (compile-time binding) occurs.

Example:

#include <iostream>
using namespace std;

// Base class
class Student {
public:
    string name;
    int rollNo;

    void getDetails() {
        cout << "Enter Student Name: ";
        cin >> name;
        cout << "Enter Roll Number: ";
        cin >> rollNo;
    }

    void display() { // No virtual keyword
        cout << "Student Name: " << name << ", Roll No: " << rollNo << endl;
    }
};

// Derived class
class Result : public Student {
public:
    float marks;

    void getDetails() {
        Student::getDetails(); // Call base class function
        cout << "Enter Marks: ";
        cin >> marks;
    }

    void display() { // Overriding function
        cout << "Student Name: " << name << ", Roll No: " << rollNo << ", Marks: " << marks << endl;
    }
};

int main() {
    Student* s; // Base class pointer
    Result r; // Derived class object

    r.getDetails(); // Get student and result details
    s = &r;
    s->display(); // Calls Student class's display() (Early Binding)

    return 0;
}


Output:
Enter Student Name: Subham
Enter Roll Number: 823078
Enter Marks: 78
Student Name: Shubham, Roll No: 823078

Process returned 0 (0x0)   execution time : 54.153 s
Press any key to continue.


Function Overriding Virtual keyword

Function overriding allows a derived class to redefine a function from its base class. Using the virtual keyword in the base class enables runtime polymorphism (dynamic binding).

Example

#include <iostream>

using namespace std;


// Base class

class Student {

public:

    string name;

    int rollNo;


    void getDetails() {

        cout << "Enter Student Name: ";

        cin >> name;

        cout << "Enter Roll Number: ";

        cin >> rollNo;

    }


    virtual void display() { // Virtual function

        cout << "Student Name: " << name << ", Roll No: " << rollNo << endl;

    }

};


// Derived class

class Result : public Student {

public:

    float marks;


    void getDetails() {

        Student::getDetails(); // Call base class function

        cout << "Enter Marks: ";

        cin >> marks;

    }


    void display()  { // Overriding function

        cout << "Student Name: " << name << ", Roll No: " << rollNo << ", Marks: " << marks << endl;

    }

};


int main() {

    Student* s; // Base class pointer

    Result r; // Derived class object


    r.getDetails(); // Get student and result details

    s = &r;

    s->display(); // Calls Result class's display() (Runtime Polymorphism)


    return 0;

}


Output:
Enter Student Name: Subham
Enter Roll Number: 823078
Enter Marks: 78
Student Name: Subham, Roll No: 823078, Marks: 78

Process returned 0 (0x0)   execution time : 54.153 s
Press any key to continue.



No comments:

Post a Comment