C++虚函数&纯虚函数学习笔记

来源:互联网 发布:类似程序员客栈 编辑:程序博客网 时间:2024/04/29 12:35

      虚函数是基类的成员函数之一。当使用此基类创建派生类时,子类要重新定义此函数以满足自己的特殊要求。

通过对象来访问虚函数的方式与以往相同,然而通过指针来访问虚函数就会体现其真正强大之处。

 

 

我定义如下类来测试非虚函数和虚函数的区别:

class Shape
{
  public:
         void WhatIsIt(){cout<<"/n这个基类的非虚函数!/n";}
         virtual void WhatAmI(){cout<<"/n这是基类的基本形状虚函数!/n";}
     
};

class Pyramid:public Shape
{
  public:
         void WhatIsIt(){cout<<"/n这是子类的非虚函数!/n";}
         void WhatAmI(){cout<<"/n这是子类的虚函数!/n";}
};     

 

 

int main(int argc, char *argv[])
{
    Shape *pShape[3],*pLShape,OneShape,TwoShape;
    Pyramid ThreeShape,*pPyramid;
    int i;
   
    pShape[0]=&OneShape;
    pShape[1]=&TwoShape;
    pShape[2]=&ThreeShape;
   
    pLShape=&ThreeShape;
    pPyramid=&ThreeShape;
   
    cout<<"/n下面是非虚函数的指针调用/n";
    for(i=0;i<3;i++) pShape[i]->WhatIsIt();
   
    pLShape->WhatIsIt();
   
    pPyramid->WhatIsIt();
   
    cout<<"/n下面是虚函数的指针调用/n";
    for(i=0;i<3;i++) pShape[i]->WhatAmI();
   
    pLShape->WhatAmI();
   
    pPyramid->WhatAmI();
    

    system("PAUSE");
    return 0;
}

 

 

输出结果:

下面是非虚函数的指针调用

 

这个基类的非虚函数!

 

这个基类的非虚函数!

 

这个基类的非虚函数!

 

这个基类的非虚函数!

 

这个子类的非虚函数!

 

下面是虚函数的指针调用

 

这个基类的非虚函数!

 

这个基类的非虚函数!

 

这个子类的非虚函数!

 

这个子类的非虚函数!

 

这个子类的非虚函数!

 

 

结果很清晰:

      当指针被定义为基类类型时,用指向子类对象的指针来调用非虚函数,结果是调用的基类成员函数。但是当同个指针调用

虚函数时,则调用的是对应的子类对象虚函数。

      就是说通过虚函数可以方便的遍历执行不同子类对象的成员函数(虚函数)。

 

纯虚函数:基类中没有函数体的虚函数

定义形式如下:

         class Shape

       {

          public:

                  virtual void WhatAmI() =0;//纯虚函数

       }