C++ 虚函数

警告
本文最后更新于 2020-06-18,文中内容可能已过时。

对C++虚函数的概念做一个简单的了解.

介绍

虚函数

虚函数指在基类使用virtual关键字声明的成员函数, 在使用对象指针时, 允许用基类的指针来调用子类的这个函数.

纯虚函数

定义一个函数为纯虚函数, 代表该函数在基类中只有声明, 但是没有被实现. 子类必须对此函数进行重写才能够使用, 与此同时, 基类由于没有提供纯虚函数的具体实现, 所以无法被实例化为对象而使用.

一、定义  纯虚函数是在基类中声明的虚函数, 它在基类中没有定义, 但要求任何派生类都要定义自己的实现方法. 在基类中实现纯虚函数的方法是在函数原型后加"=0"  virtual void funtion1()=0;

二、引入原因  1、为了方便使用多态特性, 我们常常需要在基类中定义虚拟函数.  2、在很多情况下, 基类本身生成对象是不合情理的. 例如, 动物作为一个基类可以派生出老虎、孔雀等子类, 但动物本身生成对象明显不合常理. 为了解决上述问题, 引入了纯虚函数的概念, 将函数定义为纯虚函数 (方法: virtual ReturnType Function()= 0;) , 则编译器要求在派生类中必须予以重写以实现多态性. 同时含有纯虚拟函数的类称为抽象类, 它不能生成对象. 这样就很好地解决了上述两个问题. 声明了纯虚函数的类是一个抽象类. 所以, 用户不能创建类的实例, 只能创建它的派生类的实例. 纯虚函数最显著的特征是: 它们必须在继承类中重新声明函数 (不要后面的=0, 否则该派生类也不能实例化) , 而且它们在抽象类中往往没有定义. 定义纯虚函数的目的在于, 使派生类仅仅只是继承函数的接口. 纯虚函数的意义, 让所有的类对象 (主要是派生类对象) 都可以执行纯虚函数的动作, 但类无法为纯虚函数提供一个合理的缺省实现. 所以类纯虚函数的声明就是在告诉子类的设计者, “你必须提供一个纯虚函数的实现, 但我不知道你会怎样实现它”.

来自虚函数和纯虚函数的区别-hackbuteer1

抽象类

带有纯虚函数的类被称为抽象类.

抽象类只能作为基类被继承, 同时如果子类也没有提供该类中纯虚函数的定义, 那么子类也是一个抽象类.

抽象类不能被实例化为对象来使用.

实验

// virtualFunc.cpp 虚函数实验
#include <stdio.h>

class Father {
  public:
    virtual void virtualFunc() {
        printf("Virtual Function of Father class\n");
    }
    void commonFunc() {
        printf("Common function of Father class\n");
    }
};

class Son : public Father { // Father必须使用public关键字修饰, 否则为不可访问的基类
  public:
    virtual void virtualFunc() {
        printf("Virtual Function of Son class\n");
    }
    void commonFunc() {
        printf("Common function of Son class\n");
    }
};

int main () {
    Father *p = new Son();
    p->virtualFunc();
    p->commonFunc();
    return 0;
}

结果:

结尾

Apache553大哥说的没错, C++是永远学不完的.

0%