#include <iostream.h>
class A
{
      private:
      static int a;
      public:
      virtual char nazwa()=0;   //klasa abstrakcyjna, nie mozna utworzyc obiektu tej klasy
      A(){a++;};
      virtual ~A(){a--;};
      static int ile(){return a;};
};
int A::a=0;

class B :public A
{
      public:
      char nazwa(){return 'B';};
};

class C:public B
{
      public:
      char nazwa(){return 'C';};
};

class D:public A
{
      private:
      static int b;
      public:
      char nazwa(){return 'D';};
      D(){b++;};
      ~D(){b--;};
      static int ile(){return b;};
};
int D::b=0;

int main()
{
    A *w[5];
    for(int i=0;i<5;i++)
    {
    char wczytane;
    cout<<"Jaka klasa?\t";
    cin>>wczytane;
    switch (wczytane)
           {
           case 'B':   {w[i]=new B; break;}
           case 'C':   {w[i]=new C; break;}
           case 'D':   {w[i]=new D; break;}
    
           default: {  cout<<"Nie mozna stworzyc takiego obiektu!"; i--; break;}
           }
    }
    for(int i=0;i<5;i++)
    {
            cout<<w[i]->nazwa()<<"\t";
    }
    cout<<endl;
    cout<<A::ile()<<endl;
    cout<<D::ile()<<endl;
    cout<<endl;
    for(int i=0;i<5;i++) delete w[i];
    cout<<A::ile()<<endl;
    cout<<D::ile()<<endl;
    system("pause");
    return 0;
}
