多态
静态多态
静态多态:函数重载,运算符重载。
动态多态
派生类和虚函数实现运行时多态。
子类重写父类的虚函数。(virtual)
重写:函数返回值类型,函数名,参数列表都相同。与重载不同
父类的指针或引用指向子类的对象。
virtual 是一个虚函数(表)指针,指向一个虚函数表,表中存函数的地址。
纯虚函数
当父类中虚函数没什么用的时候。可以把他写成纯虚函数的方法。
含纯虚函数的类称为抽象类。
virtual void func() =0;
抽象类的特点
- 无法实例化对象
- 子类必须重写父类的方法。
虚析构和纯虚析构
父类指针析构时候 不会调用子类中析构函数,导致,如果子类有堆区(new)数据,不会释放
Animal *animale = new Cat("Tom");
animal->speak();
delete animal;
解决:虚析构
virtual `Animal(){
//虚析构就释放干净了
}