多态和虚函数的基本概念

  • 虚函数 virtual
    • 只用在类定义里的函数声明中, 写函数体时不用
    • 构造函数和静态成员函数不能是虚函数
  • 多态
    • 派生类指针可以赋给基类指针
    • 通过基类指针调用基类和派生类中的同名虚函数时
      • 若该指针指向一个基类的对象, 那么被调用的是基类的虚函数
      • 若该指针指向一个派生类的对象, 那么被调用的是派生类的虚函数
    • 在非构造函数和非析构函数中调用虚函数, 是多态

多态实现原理

  • 编译时不能确定, 运行时才能确定 动态联编

image-20250120222219585image-20250120222231647

  • 多态会有空间和时间上的额外开销

虚析构函数

  • 在删除一个指向派生类的基类指针时, 只会调用基类的析构函数, 这会导致内存泄漏

  • 解决方法

    • 把基类的析构函数声明为virtual
      • 派生类的析构函数virtual可以不进行声明
      • 通过基类的指针删除派生类对象时
        • 首先调用派生类的析构函数
        • 然后调用基类的析构函数
    • 类如果定义了虚函数, 则最好将析构函数也定义成虚函数

纯虚函数和抽象类

  • 纯虚函数: 没有函数体的虚函数

    • virtual void print() = 0;
  • 抽象类: 包含纯虚函数的类

    • 只能作为基类来派生新类使用

    • 不能创建抽象类的对象

    • 抽象类的指针和引用 -> 由抽象类派生出来的类的对象

      image-20250120222243983