A standard question regarding object oriented design (especially when done in C++ with STL) is why containers don't respect inheritance.

Suppose I have Cars that are Vehicles:

class Vehicle {
  // ...
};
class Car : public Vehicle {
  // ...
};
Then a Car can be converted to a Vehicle, and a pointer to a Car can be converted to a pointer to a Vehicle (no casting necessary).

But if I have a container of Cars, it doesn't inherit from a similar container of Vehicles, and cannot be converted to one under any circumstances! Why? Isn't a list of Cars (list<Car>) a type of a list of Vehicles (list<Vehicle>)?

Suprisingly, the answer is simply NO!

Suppose we implement a one-lane traffic jam as a list of Cars (it's basically a queue). Then I can add Cars to the jam using jam.push_back(c); (where jam is the jam and c is a Car), and I can sometimes remove a car from the jam using c = jam.pop_front(c);.

But suppose I could say list<Vehicle>& unsafe = jam;, or pass jam to a function as a reference parameter unsafe of type list<Vehicle>. Suppose also I had another type Yacht in my program:

class Yacht : public Vehicle {
  // ...
};
Yacht my_yacht;
Then I could say unsafe.push_back(my_yacht); (since Yacht isa Vehicle). Ouch! I'd now have a yacht in a traffic jam -- not type safe behaviour!

For similar reasons, conversion from Car** to Vehicle** is disallowed -- it's just not type safe.

If you really need to do this, you have to define your own adaptor containers which let you perform access in a type safe fashion. And once again, you'll need to use generic programming (not just object oriented programming) in your program if you want any reusability.