ad hoc Polymorphism
This module introduces you to the concept of polymorphism and why it is essential to designing code that requires little modification when functionality is added.
you will learn:
- What polymorphism is and why it's useful
- About the two types of ad hoc polymorphism: conversion and overloading
- How to create special conversion member functions to convert from a user-defined type to built-in type
- How the compiler picks the appropriate version of an overloaded function
What is ad hoc Polymorphism?
Ad hoc polymorphism is a type of polymorphism in computer programming where a single function or operator can perform different operations or behave differently depending on the type or number of arguments passed to it. In other words, ad hoc polymorphism allows a function to have different implementations depending on the type or number of arguments passed to it. This is different from parametric polymorphism, where a function can be applied to arguments of any type, but behaves the same way for all types. One common example of ad hoc polymorphism is operator overloading in object-oriented programming languages like C++ or Python. In these languages, operators such as "+" or "-" can be overloaded to perform different operations depending on the types of the operands. For example, in Python, the "+" operator can be used to concatenate two strings or add two numbers, depending on the types of the operands. This is an example of ad hoc polymorphism because the "+" operator can have different behavior depending on the types of the operands passed to it.
In object-oriented programming, polymorphism refers to a programming language's ability to process objects differently depending on their data type or class. Furthermore, it is the ability to redefine methods for derived classes. Example: Given a base class shape, polymorphism enables the programmer to define different area methods for any number of derived classes, such as circles, rectangles and triangles. No matter what shape an object is, applying the area method to it will return the correct results. Polymorphism is considered to be a requirement of any true object-oriented programming language (OOPL).
Polymorphism is supported by C++ both at compile time and at run time. As discussed in earlier modules, compile-time polymorphism is achieved by overloading functions and operators. Run-time polymorphism is accomplished by using inheritance and virtual functions, and these are the topics of this module.
A virtual function is a member function that is declared within a base class and redefined by a derived class. To create a virtual function, precede the function's declaration in the base class with the keyword virtual. When a class containing a virtual function is inherited, the derived class redefines the virtual function to fit its own needs. In essence, virtual functions implement the one interface, multiple methods philosophy that underlies polymorphism. The virtual function within the base class defines the form of the interface to that function. Each redefinition of the virtual function by a derived class implements its operation as it relates specifically to the derived class.
That is, the redefinition creates a specific method. When accessed "normally," virtual functions behave just like any other type of class member function. However, what makes virtual functions important and capable of supporting run-time polymorphism is how they behave when accessed via a pointer.
A base-class pointer can be used to point to an object of any class derived from that base. When a base pointer points to a derived object that contains a virtual function, C++ determines which version of that function to call based upon the type of object pointed to by the pointer. And this determination is made at run time. Thus, when different objects are pointed to, different versions of the virtual function are executed. The same effect applies to base-class references.