//includes

#include <iostream.h>
#include <string.h>


class base {
	public:
		char name[16];
   public:
    	virtual void irgendwas() = 0;
	};

class derived1: public base {
  public:
    derived1(){strcpy(name,"derived1");}
    virtual void irgendwas()
      { cout << name << " ich tue etwas!!\n"; }
	};

class derived2: public base {
  public:
    derived2(){strcpy(name,"derived2");}
    virtual void irgendwas()
      { cout << name << " ich tue etwas anderes!!\n"; }
	};

class derived1a: public derived1 {
  public:
    derived1a(){strcpy(name,"derived1a");}
    virtual void irgendwas()
      {
         derived1::irgendwas();
      	cout << name << " und auch noch etwas anderes als derived1 !!\n";
      }
	};

main()
{
	base * objekt[4]; // Zeiger auf abstrakte Klasse geht
   int select;

   // objekt[0] = new base;  //Objekt abstrakter Klasse geht nicht
   objekt[0] = new derived1;
   objekt[1] = new derived2;
   objekt[2] = new derived1a;

   cout << "Welche Klasse (1, 2, 3)\n";
   cin >> select;
   switch (select) {
   	case 1: 	objekt[3] = new derived1;
              	break;
      case 2: 	objekt[3] = new derived2;
              	break;
      case 3: 	objekt[3] = new derived1a;
               break;
      default: cout << "Falsche Eingabe!\n";
               objekt[3] = new derived1;
              	break;
   };

   for (int i=0; i<4; ++i)
   	objekt[i]->irgendwas();

   cout << "\n Aufruf ((derived1a*) objekt[2])->derived1::irgendwas()\n";
   ((derived1a*) objekt[2])->derived1::irgendwas();

   derived1a d1a;

   cout <<"\n aufruf d1a.irgendwas:\n";
	d1a.irgendwas();

   cout <<"\n aufruf d1a.derived1::irgendwas:\n";
	d1a.derived1::irgendwas();

   cin >> select;
}
