纯虚函数从名字可以看出应该也是虚函数,哪与虚函数有什么不同吗?
纯虚函数与虚函数不同点:
1.定义方式不同
1 2 |
virtual void draw(); //虚函数 virtual void draw() = 0; //纯虚函数 |
2.类中有虚函数可以定义对象,类中有纯虚函数不可以定义对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
class BaseGraphics1{ public: BaseGraphics1(){} ~BaseGraphics1(){ cout<<"BaseGraphics类析构函数"<<endl; } virtual void draw(){ //虚函数 cout<<"BaseGraphics类draw函数"<<endl; } }; class BaseGraphics2{ public: BaseGraphics2(){} ~BaseGraphics2(){ cout<<"BaseGraphics类析构函数"<<endl; } virtual void draw() = 0; //纯虚函数 }; BaseGraphics1 baseGrap1; //可以定义对象 BaseGraphics1 baseGrap2; //错误,不可以定义对象 |
不能定义对象,哪定义这类有什么用?这就要讲到另一个知识:抽象类
抽象类:类中带有纯虚函数的就是抽象类,抽象类不能实例化(也就是不能定义对象)。
作用就是用来设计接口,派生类来实现接口作用。这样讲感觉不到有什么用。现在写下实际运用的案例来加深对抽象类理解。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
// 梁笔记 // https://zouzhongliang.com #include <iostream> #include <ctime> using namespace std; class BaseGraphics{ private: public: BaseGraphics(){} virtual ~BaseGraphics(){ cout<<"BaseGraphics类析构函数"<<endl; } virtual void draw() = 0; virtual void setcolor() = 0; virtual void setlinewidth() = 0; virtual void setbgcolor() = 0; }; class circle : public BaseGraphics{ private: public: circle(){} virtual ~circle(){ cout<<"circle类析构函数"<<endl; } virtual void draw(){ cout<<"circle类draw函数"<<endl; } virtual void setcolor(){ } virtual void setlinewidth(){ } virtual void setbgcolor(){ } }; class square : public BaseGraphics{ private: public: square(){} virtual ~square(){ cout<<"square类析构函数"<<endl; } virtual void draw(){ cout<<"square类draw函数"<<endl; } virtual void setcolor(){ } virtual void setlinewidth(){ } virtual void setbgcolor(){ } }; class line : public BaseGraphics{ private: public: line(){} virtual ~line(){ cout<<"line类析构函数"<<endl; } virtual void draw(){ cout<<"line类draw函数"<<endl; } virtual void setcolor(){ } virtual void setlinewidth(){ } virtual void setbgcolor(){ } }; int main() { cout<<endl; cout<<"虚函数多态方式调用函数"<<endl; BaseGraphics* pbaseGrap[3] = {new circle(),new square(),new line()}; for(int i =0;i<3;i++){ pbaseGrap[i]->draw(); } for(int i =0;i<3;i++){ delete pbaseGrap[i]; } return 0; } |
输出结果:
1 2 3 4 5 6 7 8 9 10 |
虚函数多态方式调用函数 circle类draw函数 square类draw函数 line类draw函数 circle类析构函数 BaseGraphics类析构函数 square类析构函数 BaseGraphics类析构函数 line类析构函数 BaseGraphics类析构函数 |
BaseGraphics类定义成抽象类接口后优点:
1.代码具有非常好的扩展性,如果再加个hexagon类也很好处理,实现BaseGraphics定义的各个接口就好了
2.有助于多人协同开发,开发接口的不同关心如何实现接口,实现接口不用想太多,按要求一个个实现就好。
3.好的维护性,比如要修改Circle类里实现,只要改Circle部份,不用动到 其它代码。