在基类中不对虚函数给出有意义的实现,它只是在派生类中有具体的意义。这时基类中的虚函数只是一个入口,具体的目的地由不同的派生类中的对象决定。这样的虚函数称为纯虚函数。
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 编程在线原创,转载请注明出处,谢谢。



