抽象类 纯虚函数

 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 */

 

posted @ 2018-05-22 10:43  小雨滴答  阅读(180)  评论(0编辑  收藏  举报