老师的要求是给出shape类,派生出梯形,圆形,正方形和矩形4个类,然后根据他们的面积进行排序并且输出相应的信息。
一开始我遇到了一个问题,我没有将4个派生类定义成数组,导致定义出来的某个类对象使用完之后就被抹除了,从而导致原先的基类指针数组的指向丢失。纯虚函数的工作原理就是指针指向这个类,所以这个类必须用数组保存起来,一旦被覆盖,指针的指向就会出现丢失或者紊乱的情况,但是经过我的观察,他好像指向最后 一次定义的对象,而是好像都是,但是具体里面是怎样实现的有待考究 。当时我还是一位是构造函数的问题,又写了set函数,又把构造删了之类的,后来发现完全不是这里的问题,而且这个地方的排序交换,我定义的id数组去模拟,而且直接交换指针对象也可以。
一组样例如下:
5
c 3
r 2 1
s 5
s 2
t 1 2 5
代码如下:
#include<iostream> using namespace std; #define pi 3.14 class Shape{ public: virtual double area() = 0; virtual void show() = 0; }; class Rec:public Shape{ private: int l,w; public: void set(int ll,int ww){ l = ll,w = ww; } double area(){ return l*w; } void show(){ cout<<"the rec's area = "<<area()<<endl; } }; class Square:public Shape{ private: int l; public: void set(int ll){ l = ll; } double area(){ return l*l; } void show(){ cout<<"the Square's area = "<<area()<<endl; } }; class Circle:public Shape{ private: int r; public: void set(int rr){ r = rr; } double area(){ return pi*r*r; } void show(){ cout<<"the Circle's area = "<<area()<<endl; } }; class Tixing:public Shape{ private: int l,w,h; public: void set(int ll,int ww,int hh){ l = ll,w = ww; h = hh; } double area(){ return (l+w)*h/2; } void show(){ cout<<"the Tixing's area = "<<area()<<endl; } }; int main(){ int t,l,w,h; Square s1[110]; Rec r1[110]; Tixing t1[110]; Circle c1[110]; char op[10]; Shape *s[110]; int id[110]; cin>>t; for(int i = 0;i < t;i++){ cin>>op; if(op[0] == 's'){ cin>>l; s1[i].set(l); s[i] = &s1[i]; } else if(op[0] == 'r'){ cin>>l>>w; r1[i].set(l,w); s[i] = &r1[i]; } else if(op[0] == 'c'){ cin>>l; c1[i].set(l); s[i] = &c1[i]; } else { cin>>l>>w>>h; t1[i].set(l,w,h); s[i] = &t1[i]; } id[i] = i; } for(int i = 0;i < t;i++){ for(int j = 0;j < t;j++){ if(s[id[i]]->area() < s[id[j]]->area()) swap(id[i],id[j]); } } for(int i = 0;i < t;i++){ s[id[i]]->show(); } return 0; }