Chinaunix首页 | 论坛 | 博客
  • 博客访问: 225542
  • 博文数量: 53
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1506
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-25 10:52
文章分类
文章存档

2014年(22)

2013年(31)

我的朋友

分类: C/C++

2014-01-02 17:40:01

虚函数与纯虚函数的区别


虚函数为了重载和多态的需要,函数在基类中是有定义的。即便是个空函数,也可以在子类中覆盖这个基类的函数。


纯虚函数在基类中是没有定义的,必须在子类中来实现。



虚函数引入的原因是为了方便使用多态:


class Animal{

.....

    public:

    virtual void speak(){cout<<"umum"<
    virtual void run(){cout<<"run!"<
};


class Human:public Animal{

......

     public:

     virtual void speak(){cout<<"你好!"<
};

class Cat:public Animal{

    ......

    public:

    virtual void speak(){coout<<"喵喵~~"<
};


class Dog:public Animal{

      ......

     public:

      virtual void speak(){cout<<"汪汪~"<
};


上面的这个简单的例子就可以说明虚函数的简单性质。


以下是调用的时候:


int main{


Animal an,*pan;

       Human hu,*phu;

       Cat ca,*pca;

       Dog dog,*pdo;

       //这是虚函数的精彩的地方,如果没有指针,没有        // 多大意思。

      pan=&an;

      phu=&hu;

      pca=&ca;

      pdo=&dog;

      pan->speak();//umum

      phu->speak();//你好

      pca->speak();//喵喵

      pdo->speak();//汪汪

      pan->run();

      phu->run();

      pca->run();

      pdo->run();//子类中没有重实现该函数,调用基                  //类中的。

      Cat *p;

      p=&an;

      // 这个地方会报错: 从类型‘Animal*’到类型‘Cat*’的转换无效

      //p->speak();

//但是

      Animal *p1;

      p1=&ca;

      p1->speak();//喵喵

      //可以把Cat看成是Animal的对象

      //子类可以调用父类的成员函数,但父类不可以调用子类的

}



纯虚函数:

通过简单的修改,下面就是纯虚函数的使用方法:

class Animal{

.....

    public:

    virtual void speak()=0;

    virtual void run()=0;

//以上两个成员函数都只能在子类中才能实现

};


class Human:public Animal{

......

     public:

     void speak(){cout<<"你好!"<
     void run(){cout<<"直立行走"<
};

class Cat:public Animal{

    ......

    public:

    void speak(){cout<<"喵喵~~"<
    void run(){cout<<"优雅的走!"<
};


class Dog:public Animal{

      ......

     public:

     void speak(){cout<<"汪汪~"<

};




int main{


// Animal an,*pan;

//Animal 成了抽象类,就不能实例化了。

//成员函数也只能在子类中进行实例化。

       Human hu,*phu;

       Cat ca,*pca;

       Dog dog,*pdo;

       //纯虚函数 也得使用指针。

      phu=&hu;

      pca=&ca;

      pdo=&dog;

      phu->speak();//你好

      pca->speak();//喵喵

      pdo->speak();//汪汪

      phu->run();直立行走

      pca->run();优雅的走

      // pdo->run(); //子类中没有实现 不能调用

      Ca *p=&dog;

      p->speak();//会出现错误 不能在初始化时将‘Dog*’转换为‘Cat*’
阅读(1257) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~