虚函数(Virtual Function)和纯虚函数(Pure Virtual Function)是面向对象编程中的概念,它们在 C++ 中的作用和用法有所不同,主要区别如下:

虚函数(Virtual Function):

  1. 定义: 虚函数是在基类中声明为虚函数的成员函数。它通过在函数声明前加上 virtual 关键字来定义。

  2. 实现: 虚函数可以有默认的实现体,也可以没有。如果一个派生类不重写(override)虚函数,它将继承基类的实现。

  3. 派生类行为: 派生类可以选择性地重写虚函数,以修改或扩展基类的行为。

  4. 可实例化: 如果基类中的虚函数有默认实现,基类可以被实例化。如果所有虚函数都是纯虚函数,基类将变成抽象类,无法实例化。

#include <iostream>

class Base {
public:
    virtual void virtualFunction() const {
        std::cout << "Base::virtualFunction()" << std::endl;
    }
    virtual ~Base() {} // 虚析构函数
};

class Derived : public Base {
public:
    void virtualFunction() const override {
        std::cout << "Derived::virtualFunction()" << std::endl;
    }
};


纯虚函数(Pure Virtual Function):

  1. 定义: 纯虚函数是在基类中声明但没有提供实现体的虚函数。它的声明以 = 0 结尾。

  2. 没有实现: 纯虚函数没有默认的实现体,只有接口声明,派生类必须重写纯虚函数才能实例化。

  3. 派生类行为: 派生类必须重写纯虚函数才能被实例化。

  4. 抽象类: 如果基类中有纯虚函数,基类将变成抽象类,无法实例化。

#include <iostream>

class Base {
public:
    virtual void pureVirtualFunction() const = 0; // 纯虚函数声明
    virtual ~Base() {} // 虚析构函数
};

class Derived : public Base {
public:
    void pureVirtualFunction() const override {
        std::cout << "Derived::pureVirtualFunction()" << std::endl;
    }
};


总结:

  • 虚函数可以有默认实现,而纯虚函数没有默认实现。
  • 派生类可以选择性地重写虚函数,而纯虚函数必须被重写。
  • 如果一个类包含纯虚函数,它将成为抽象类,无法实例化。

更多推荐