Skip to content
On this page

CPP_多态


标签:CPP/面向对象  

多态

函数重写

  • 父类定义虚函数,子类函数签名一致
  • 父类需要在函数签名用 virtual 指定函数为虚函数,子类可选在重写函数签名添加 override
  • 使用父类的指针或引用指向子类对象,调用子类对象重写的虚函数,这个过程实现拆多态
  • 父类自制指向哪个子类,就调用哪个子类中的函数
  • 有虚函数的类多占用一个指针 *vptr 的内存(CPP类#类的大小):用来给子类继承,这个指针指向堆区的一个表 v_table,保存类中的虚函数指针(本质是函数指针数组,*vptr 是函数指针数组指针),因为子类继承了这个指针,因此,子类可以找到父类对应的虚函数调用。
  • Override.cpp

实现多态的必要条件

  1. 有继承关系,发生在父子类之间
  2. 有虚函数
  3. 子类重写父类虚函数
  4. 父类指针或引用指向子类对象并调用重写的虚函数

虚析构函数

  • 由于父类指针指向子类对象,父类无法访问子类空间,在使用 delete 释放时,只能调用到父类的析构函数
  • 此时可以将父类的析构函数设置为虚析构函数,这样就能正确引导 delete 关键字,在释放父类的空间后继续析构子类的空间
  • 格式 virutal ~Stu() {}
  • 当类中的某个函数设置成虚函数后,其后代子孙的析构函数即使不加 vritual 也是虚析构函数
  • 在开发中,定义的类作为父类,其析构函数经可能设置成虚析构函数

纯虚函数

  • 父类不需要实现,完全由子类实现
  • 定义格式 virtual void fun() = 0,使用 =0 替换函数体
  • 包含纯虚函数的类不能存在实例化对象(这个类本身不支持实例化)
  • 必须在子类重写后才能创建实例,子类不重写,子类也不能创建实例

抽象类

  • 包含一个或者多个抽象方法(纯虚函数)的类叫做抽象类
  • 抽象类不能实例化对象

Last updated: