动态映射 安全类型向下映射
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <vector>
using namespace std;
class shape{
public:
shape() { count++; }
virtual ~shape() { count--; }
virtual void draw() const = 0;
static int quantity() { return count; }
protected:
static int count;
};
int shape::count = 0;
class rectangle:public shape{
void operator=(rectangle&);
protected:
static int count;
public:
rectangle() { count++; }
rectangle(const rectangle&){ count++; }
~rectangle() { count--; }
void draw() const {
cout<<"rectangle::draw()"<<endl;
}
static int quantity() { return count; }
};
int rectangle::count = 0;
class ellipse:public shape{
void operator=(ellipse&);
protected:
static int count;
public:
ellipse() { count++; }
ellipse(const ellipse&){ count++; }
~ellipse() { count--; }
void draw() const{
cout<<"ellipse::draw()"<<endl;
}
static int quantity() { return count; }
};
int ellipse::count = 0;
class circle:public shape{
void operator=(circle&);
protected:
static int count;
public:
circle() { count++; }
circle(const circle&){ count++; }
~circle(){ count--; }
void draw() const{
cout<<"circle::darw()"<<endl;
}
static int quantity() { return count; }
};
int circle::count = 0;
int main()
{
vector<shape*> shapes;
time_t t;
srand((unsigned int)time(&t));
const int mod = 12;
for(int i=0; i<rand()%mod; ++i)
shapes.push_back(new rectangle);
for(int i=0; i<rand()%mod; ++i)
shapes.push_back(new circle);
for(int i=0; i<rand()%mod; ++i)
shapes.push_back(new ellipse);
int Ncircles = 0;
int Nellipses = 0;
int Nrects = 0;
int Nshapes = 0;
for(int i=0; i<shapes.size(); ++i)
{
shapes[i]->draw();
if(dynamic_cast<circle*>(shapes[i]))
Ncircles++;
if(dynamic_cast<ellipse*>(shapes[i]))
Nellipses++;
if(dynamic_cast<rectangle*>(shapes[i]))
Nrects++;
if(dynamic_cast<shape*>(shapes[i]))
Nshapes++;
cout<<"dynamic_cast:"<<Nshapes<<endl;
}
cout<<endl<<endl
<<"circles="<<Ncircles<<endl
<<"ellipse = "<<Nellipses<<endl
<<"rectangles = "<<Nrects<<endl
<<"shapes = "<<Nshapes<<endl
<<endl
<<"circle::quantity()="<<circle::quantity()<<endl
<<"ellipse::quantity = "<<ellipse::quantity()<<endl
<<"rectangle::quantity()="<<rectangle::quantity()<<endl
<<"shape::quantity()="<<shape::quantity()<<endl;
for(int i=0; i<shapes.size(); ++i)
delete shapes[i];
circle * ptemp = new circle;
delete ptemp;
return 0;
}