C++ 虚函数与纯虚函数的区别

17 Mar 2025 | 5 分钟阅读

在理解C++中虚函数和纯虚函数的区别之前,我们应该先了解C++中的虚函数和纯虚函数是什么。

什么是虚函数?

虚函数是在基类中声明并且可以被派生类重新定义的成员函数。

让我们通过一个例子来理解。

在上面的代码中,我们没有使用虚方法。我们创建了一个包含show()函数的基类。同时还创建了名为'derived1'和'derived2'的两个类,它们继承了基类的属性。'derived1'和'derived2'这两个类都重新定义了show()函数。在main()方法内部,声明了基类(base)的指针变量'b'。d1和d2分别是derived1和derived2类的对象。尽管'b'包含了d1和d2的地址,但在调用show()方法时,它总是调用基类的show()方法,而不是调用derived1和derived2类的函数。

为了克服上述问题,我们需要在基类中将该方法设为虚函数。这里的虚(virtual)意味着该方法在表面上存在,但实际上并非如此。我们可以通过在函数前简单地添加virtual关键字来将其设为虚函数。在上面的程序中,我们需要在基类中的show()函数前添加virtual关键字,如下所示:

一旦做出上述更改,输出将是:

要点

  • 这是一种运行时多态性。
  • 当基类和派生类有相同的函数名,并且基类指针被赋予了派生类对象的地址时,该指针仍然会执行基类的函数。
  • 如果函数被设为虚函数,那么编译器将在运行时根据赋给基类指针的地址来决定执行哪个函数。

什么是纯虚函数?

纯虚函数是一个在类内部没有定义的虚函数。让我们通过一个例子来理解纯虚函数的概念。

在上图中,shape是基类,而rectangle、square和circle是派生类。由于我们没有为虚函数提供任何定义,它将自动转换成一个纯虚函数。

纯虚函数的特点

  • 纯虚函数是一个“什么都不做”的函数。这里的“什么都不做”意味着它只提供一个模板,而由派生类来实现该函数。
  • 它可以被认为是一个空函数,意味着纯虚函数相对于基类没有任何定义。
  • 程序员需要在派生类中重新定义纯虚函数,因为它在基类中没有定义。
  • 一个含有纯虚函数的类不能用于创建自己的直接对象。这意味着如果一个类包含任何纯虚函数,我们就不能创建该类的对象。这类类被称为抽象类。

语法

创建虚函数有两种方式

让我们通过一个例子来理解。

虚函数与纯虚函数的区别

Virtual function vs Pure virtual function in C++
虚函数纯虚函数
虚函数是基类中的一个成员函数,可以在派生类中被重新定义。纯虚函数是基类中的一个成员函数,其声明在基类中提供,而在派生类中实现。
包含虚函数的类不是抽象类。包含纯虚函数的类是抽象类。
对于虚函数,函数的定义在基类中提供。对于纯虚函数,函数的定义不在基类中提供。
包含虚函数的基类可以被实例化。包含纯虚函数的基类会变成一个抽象类,不能被实例化。
如果派生类不重新定义基类的虚函数,编译不会受到任何影响。如果派生类不定义纯虚函数,它不会抛出任何错误,但该派生类会变成一个抽象类。
所有的派生类可以重新定义,也可以不重新定义虚函数。所有的派生类必须定义纯虚函数。