在基类中不对虚函数给出有意义的实现,它只是在派生类中有具体的意义。这时基类中的虚函数只是一个入口,具体的目的地由不同的派生类中的对象决定。这样的虚函数称为纯虚函数。
class <基类名> { virtual <类型><函数名>(<参数表>)=0; ...... };
上面是虚函数的一般定义形式。
1、在定义纯虚函数时,不能定义虚函数的实现部分。
2、把函数名赋于0,本质上是将指向函数体的指针值赋为初值0。
与定义空函数不一样,空函数的函数体为空,即调用该函数时,不执行任何动作。在没有重新定义这种纯虚函数之前,是不能调用这种函数的。
3、把至少包含一个纯虚函数的类,称为抽象类。
这种类只能作为派生类的基类,不能用来说明这种类的对象。其理由是明显的:因为虚函数没有实现部分,所以不能产生对象。但可以定义指向抽象类的指针,即指向这种基类的指针。当用这种基类指针指向其派生类的对象时,必须在派生类中重载纯虚函数,否则会产生程序的运行错误。
4、在以抽象类作为基类的派生类中必须有纯虚函数的实现部分,即必须有重载纯虚函数的函数体。
否则,这样的派生类也是不能产生对象的。
综上所述,可把纯虚函数归结为:抽象类的唯一用途是为派生类提供基类,纯虚函数的作用是作为派生类中的成员函数的基础,并实现动态多态性。
//抽象类 class A{ protected: int x; public: A(){x =1000;} virtual void print()=0; //定义纯虚函数 }; class B:public A{ //派生类 private: int y; public: B(){ y=2000;} void print(){cout <<“y=”<<y<<‘\n’;}//重新定义纯虚函数 }; class C:public A{ //派生类 int z; public: C(){z=3000;} void print(){cout <<“z=”<<z<<‘\n’;}//重新定义纯虚函数 }; void main(void ) { A *pa; B b; C c; pa=&b; pa->print(); pa=&c; pa->print(); } 运行结果: y=2000 z=3000
如果在上面的mian()函数中加入”A a; pa=&a; pa->print( );”,则编译器会报错,因为抽象类没有具体实现,所以不能定义它的对象。
除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。