C++ 面向对象编程:多态

多态的类型

  • 静态多态:函数重载和运算符重载,静态多态编译阶段确定函数地址
  • 动态多态:派生类和虚函数实现的运行时多态,动态多态运行时阶段确定函数地址

动态多态的原理

在虚函数中,函数的地址通过 vfptr 来标记。子类会继承 vfptr 并指向不同的函数

  • (带虚函数的)父类:vfptr -> vftable: &Base::func()
  • (重写虚函数)子类:vfptr -> vftable: &Son::func()

动态多态的实现

  • 有继承关系
  • 子类重写父类中的虚函数(函数前加 virtual 关键字)

动态多态的使用

父类的引用或指针指向子类的对象

纯虚函数和抽象类

virtual int getResult() = 0;  // 后面带 = 0 的即为纯虚函数

带有纯虚函数的类被称为抽象类,抽象类的特点是:

  • 无法实例化对象
  • 子类必须重写抽象类中的虚函数,否则仍然是抽象类

纯虚析构

使用析构时,如果子类中属性开辟到堆区,那么父类的指针将无法调用子类的析构

此时应将父类析构改成虚析构或纯虚析构

  • 纯虚析构必须要有实现
  • 带纯虚析构的类也是抽象类