1 #include <iostream> 2 using namespace std; 3 /************************************************************************/ 4 /*抽象类不能定义对象,为了强调一个类为抽象类,可将该类的构造函数说明为保护的访问控制权限 5 抽象类只用作基类,其纯虚函数的实现由派生类给出 6 如果派生类定义了纯虚函数,该派生类就可以当做具体类,不定义仍然是抽象类 7 /************************************************************************/ 8 class point //抽象类: 带有纯虚函数的类为抽象类 9 { 10 public: 11 point(int i=0,int j=0) 12 { 13 x0=i; 14 y0=j; 15 } 16 virtual void set()=0; //纯虚函数 在基类中不对函数做有意义的实现,将它说明为纯虚函数,其实现留给基类的派生类去做 virtual <函数类型><函数名><(参数表)>=0 17 virtual void draw()=0; 18 19 protected: 20 int x0,y0; 21 }; 22 23 class line:public point //line为抽象类point的派生类,并重新定义了基类的纯虚函数 24 { 25 public: 26 line(int i=0,int j=0,int m=0,int n=0):point(i,j) 27 { 28 x1=m,y1=n; 29 } 30 void set() 31 { 32 cout<<"line::set() called.\n"; 33 } 34 void draw() 35 { 36 cout<<"line::draw() called.\n"; 37 } 38 protected: 39 int x1,y1; 40 }; 41 42 43 class ellipse:public point 44 { 45 public: 46 ellipse(int i=0,int j=0,int p=0,int q=0):point(i,j) 47 { 48 x2=p,y2=q; 49 } 50 void set() 51 { 52 cout<<"ellipse::set() called.\n"; 53 } 54 void draw() 55 { 56 cout<<"ellipse::draw() called.\n"; 57 } 58 protected: 59 int x2,y2; 60 }; 61 void drawobj(point *p) 62 { 63 p->draw(); 64 } 65 void setobj(point *p) 66 { 67 p->set(); 68 } 69 void main() 70 { 71 line *lineobj=new line; 72 ellipse *elliobj=new ellipse; 73 drawobj(lineobj); 74 drawobj(elliobj); 75 cout<<endl; 76 setobj(lineobj); 77 setobj(elliobj); 78 cout<<"\nRedraw the object...\n"; 79 drawobj(lineobj); 80 drawobj(elliobj); 81 system("pause"); 82 } 83 /*纯虚函数只能作为基类来使用,其纯虚函数的实现是由派生类给出的。 84 如果派生类没有重新定义纯虚函数,而只是集成基类的纯虚函数,则这个派生类仍然还是一个抽象类,不能直接使用 85 */