您的位置:首页 > 编程语言 > C语言/C++

dynamic_cast.cpp

2015-06-15 11:52 302 查看
动态映射 安全类型向下映射

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: