When thinking of compile-time polymorphism, the first thing that comes to mind is functions overloading. But here we will learn how to achieve compile-time polymorphism with templates.
Polymorphism is one of the four-four basic concepts of OOP (Object Oriented Programming) that are Inheritance, Abstraction, Polymorphism, and Encapsulation. I believe you already know polymorphism and its concept.
Let’s first understand the compile-time polymorphism. The Compile-time polymorphism is a polymorphism that happens at compile time. What this means is that the compiler must know what is going on. This is also mentioned as static time polymorphism, compile-time binding, static binding, early binding.
Now it’s time to understand how C++ templates can be used to achieve compile-time polymorphism. Here I am taking a very simple example to show you that how you can achieve compile-time polymorphism with templates.
Compile-time polymorphism using a class template:
As I have discussed that we can achieve compile-time polymorphism by templates in C++. In the below example, I am going to create a template class StudentFee
that can take any type. The template class allows a name (string) to be prepended to any class, with the proviso that the base class (the template parameter) supports the member function fees().
In this example, we have constructed a normal class, EngStudent, and MbaStudent, which supports the fees() method. When we create a StudentFee object, we give it the type of object we want to ‘decorate’ with a name.
Like in the below example I have created two objects of StudentFee one with EngStudent, and another with MbaStudent. Calling annualFees() on a StudentFee object will call the fees() on its base class – in our example EngStudent::fees() and MbaStudent::fees(). Let’s see the code,
Note:
T is a very common name for a template parameter and we usually used it instead of more meaningful names.
#include <iostream> template <class T> class StudentFee : T { public: void annualFees() { this->fees(); } }; class EngStudent { public: void fees() { std::cout << "EngStudent Fees = INR 70,000" << std::endl; } }; class MbaStudent { public: void fees() { std::cout << "MbaStudent Fees = INR 95,000" << std::endl; } }; int main() { StudentFee<EngStudent> engStudent; StudentFee<MbaStudent> mbaStudent; engStudent.annualFees(); mbaStudent.annualFees(); return 0; }
Output:
Compile-time polymorphism using a function template:
Like the template class, we can achieve compile-time polymorphism by function templates in C++. In the below example, I am going to create a function templatecustom_add()
that can add any built-in data type. The compiler’s responsibility is to generate code for different input types based on the instructions you gave. See the below-mentioned code.
#include <iostream> template <class T> void custom_add (T val1, T val2) { std::cout << "Addition = " << (val1 + val2) << std::endl; } int main () { custom_add<int>(3, 5); // type specifier <int> present custom_add<float>(3.2, 4.5); // type specifier <float> present custom_add<double>(3.2123, 4.5456); // type specifier <float> present return 0; }
Output:
Addition = 8
Addition = 7.7
Addition = 7.7579
Recommended Articles for you:
- C++ Programming Courses And Tutorials
- Operator Overloading in C++ with some FAQ.
- MCQs on Virtual function in C++.
- MCQs on C++ Templates.
- Introduction of reference in C++.
- Use of mutable keywords in C++.
- Best electronic kits for programmers.
- References and const in C++ with example programs.
- C++ Interview Questions with Answers.
- List of some Best C++ Books, you must see.