This design doesn't seem to make much sense. Base classes shouldn't know about classes derived from them. Also there doesn't seem any reason in C++ to implement your own doubly-linked list.
Without all in-house linked list implementation non-sense:
Code:
#include <iostream>
#include <list>
#include <algorithm>
#include <functional>
class Car
{
public:
virtual ~Car() {}
virtual void print() const = 0;
};
class Diesel: public Car
{
};
class Petrol: public Car
{
public:
void print() const { std::cout << "Petrol\n"; }
};
class DieselHardTop: public Diesel
{
public:
void print() const { std::cout << "DieselHardTop\n"; }
};
class DieselSoftTop: public Diesel
{
public:
void print() const { std::cout << "DieselSoftTop\n"; }
};
template <class T>
void Delete(const T* t)
{
delete t;
}
int main()
{
enum { petrol = 1, diesel_hardtop, diesel_softtop, max_car_type };
std::list<Car*> cars;
int choice;
while (std::cout << "Enter " << petrol << " for Petrol, " << diesel_hardtop << " for DieselHardTop, "
<< diesel_softtop << " for DieselSoftTop or other to quit: "
&& std::cin >> choice && choice > 0 && choice < max_car_type) {
switch (choice) {
case petrol:
cars.push_back(new Petrol);
break;
case diesel_hardtop:
cars.push_back(new DieselHardTop);
break;
case diesel_softtop:
cars.push_back(new DieselSoftTop);
break;
}
}
std::for_each(cars.begin(), cars.end(), std::mem_fun(&Car::print));
std::for_each(cars.begin(), cars.end(), Delete<Car>);
}