Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Inheritance & virtual functions Vs Generic Programming

I need to Understand that whether really Inheritance & virtual functions not necessary in C++ and one can achieve everything using Generic programming. This came from Alexander Stepanov and Lecture I was watching is Alexander Stepanov: STL and Its Design Principles

like image 478
Avinash Avatar asked Nov 04 '11 12:11

Avinash


People also ask

What does inheritance mean in family?

It is a process which involves the passing on of material property from one generation to another, usually within the family, generally from older parents (donors) to their adult children (heirs), which is completed after the death of the older generation.

What happens in inheritance?

Plot. A woman's inheritance takes her to Europe where she will uncover a dark and disturbing family secret. Once she is alone in the former family manor, paranormal occurrences in the home begin and slowly intensify. She is forced to face her fears to uncover dark secrets lurking in her family history.

What is the synonym of inheritance?

bequest. nounsomething given in will. bequeathal. bequeathment. bestowal.


4 Answers

I always like to think of templates and inheritance as two orthogonal concepts, in the very literal sense: To me, inheritance goes "vertically", starting with a base class at the top and going "down" to more and more derived classes. Every (publically) derived class is a base class in terms of its interface: A poodle is a dog is an animal.

On the other hand, templates go "horizontal": Each instance of a template has the same formal code content, but two distinct instances are entirely separate, unrelated pieces that run in "parallel" and don't see each other. Sorting an array of integers is formally the same as sorting an array of floats, but an array of integers is not at all related to an array of floats.

Since these two concepts are entirely orthogonal, their application is, too. Sure, you can contrive situations in which you could replace one by another, but when done idiomatically, both template (generic) programming and inheritance (polymorphic) programming are independent techniques that both have their place.

Inheritance is about making an abstract concept more and more concrete by adding details. Generic programming is essentially code generation.

As my favourite example, let me mention how the two technologies come together beautifully in a popular implementation of type erasure: A single handler class holds a private polymorphic pointer-to-base of an abstract container class, and the concrete, derived container class is determined a templated type-deducing constructor. We use template code generation to create an arbitrary family of derived classes:

// internal helper base
class TEBase { /* ... */ };

// internal helper derived TEMPLATE class (unbounded family!)
template <typename T> class TEImpl : public TEBase { /* ... */ }

// single public interface class
class TE
{
  TEBase * impl;
public:
  // "infinitely many" constructors:
  template <typename T> TE(const T & x) : impl(new TEImpl<T>(x)) { }
  // ...
};
like image 152
Kerrek SB Avatar answered Oct 04 '22 11:10

Kerrek SB


They serve different purpose. Generic programming (at least in C++) is about compile time polymorphisim, and virtual functions about run-time polymorphisim.

If the choice of the concrete type depends on user's input, you really need runtime polymorphisim - templates won't help you.

like image 45
Nemanja Trifunovic Avatar answered Oct 04 '22 11:10

Nemanja Trifunovic


Polymorphism (i.e. dynamic binding) is crucial for decisions that are based on runtime data. Generic data structures are great but they are limited.

Example: Consider an event handler for a discrete event simulator: It is very cheap (in terms of programming effort) to implement this with a pure virtual function, but is verbose and quite inflexible if done purely with templated classes.

As rule of thumb: If you find yourself switching (or if-else-ing) on the value of some input object, and performing different actions depending on its value, there might exist a better (in the sense of maintainability) solution with dynamic binding.

Some time ago I thought about a similar question and I can only dream about giving you such a great answer I received. Perhaps this is helpful: interface paradigm performance (dynamic binding vs. generic programming)

like image 23
bitmask Avatar answered Oct 04 '22 12:10

bitmask


It seems like a very academic question, like with most things in life there are lots of ways to do things and in the case of C++ you have a number of ways to solve things. There is no need to have an XOR attitude to things.

like image 21
AndersK Avatar answered Oct 04 '22 13:10

AndersK