一、概念:调用同名函数,由于上下文的不同会有不同实现的一种机制。
二、种类:
1、静态多态----函数重载、运算符重载 动态多态----父子间继承+虚函数
2、动态多态的满足条件:
- 父类中有虚函数
- 子类重写父类中的虚函数
- 父类指针或引用指向子类对象
三、纯虚函数和抽象类
- 纯虚函数语法:virtual+函数类型+函数名()=0; eg:virtual void func()=0;
- 如果类中有了纯虚函数,那么这个类也叫抽象类。
- 抽象类无法实例化对象。
- 继承抽象类的子类,必须重写父类中的纯虚函数,否则子类也是抽象类
四、虚析构与纯虚析构
- 如果子类中有创建在堆中的属性,那么多态情况下,不会调用子类的析构代码,就会导致内存泄漏。
- 解决方案:理由虚析构或者纯虚析构。
- 虚析构:在析构函数前加virtual关键字。
- 纯虚析构语法:virtual+~函数名()=0; eg: virtual ~Student()=0;
五、向上向下类型转换
1.父类转子类 向下类型转化 不安全。 原因:子类继承父类,子类的空间比父类大,那么从父类转子类的时候,指针可能会指向,子类比父类大的那一部分,会导致指针越界
2.子类转父类 向上类型转化 安全。
3.如果发生多态,那么上述均为安全。
发生多态,父类指针指向子类对象,即为父类分配一个子类大小的空间。不管指针怎么指向,都是不会越界。