dynamic_cast.cpp

来源:互联网 发布:如何建立网络折扣平台 编辑:程序博客网 时间:2024/05/17 06:09

动态映射             安全类型向下映射

#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;}


 

0 0