Appearance
多态
函数重写
- 父类定义虚函数,子类函数签名一致
- 父类需要在函数签名用
virtual指定函数为虚函数,子类可选在重写函数签名添加override - 使用父类的指针或引用指向子类对象,调用子类对象重写的虚函数,这个过程实现拆多态
- 父类自制指向哪个子类,就调用哪个子类中的函数
- 有虚函数的类多占用一个指针
*vptr的内存(CPP类#类的大小):用来给子类继承,这个指针指向堆区的一个表v_table,保存类中的虚函数指针(本质是函数指针数组,*vptr是函数指针数组指针),因为子类继承了这个指针,因此,子类可以找到父类对应的虚函数调用。 - Override.cpp
实现多态的必要条件
- 有继承关系,发生在父子类之间
- 有虚函数
- 子类重写父类虚函数
- 父类指针或引用指向子类对象并调用重写的虚函数
虚析构函数
- 由于父类指针指向子类对象,父类无法访问子类空间,在使用
delete释放时,只能调用到父类的析构函数 - 此时可以将父类的析构函数设置为虚析构函数,这样就能正确引导
delete关键字,在释放父类的空间后继续析构子类的空间 - 格式
virutal ~Stu() {} - 当类中的某个函数设置成虚函数后,其后代子孙的析构函数即使不加
vritual也是虚析构函数 - 在开发中,定义的类作为父类,其析构函数经可能设置成虚析构函数
纯虚函数
- 父类不需要实现,完全由子类实现
- 定义格式
virtual void fun() = 0,使用=0替换函数体 - 包含纯虚函数的类不能存在实例化对象(这个类本身不支持实例化)
- 必须在子类重写后才能创建实例,子类不重写,子类也不能创建实例
抽象类
- 包含一个或者多个抽象方法(纯虚函数)的类叫做抽象类
- 抽象类不能实例化对象