什么是多态?
多态的定义:
多态:一个接口多个实现方式,即:多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。
条件:
- 必须通过基类的指针或者引用调用虚函数 (虚函数:即被virtual修饰的类成员函数称为虚函数)
- 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写
多态的实现方式
重载、覆盖、重写
重载
重载分为函数重载和运算符重载
- 函数重载:同一作用域内函数名相同、函数参数类型、顺序、个数不同等即可发生函数重载
- 运算符重载:除了. .* ->* :: ?: #之外都可以重载。
重写
- 重写是发生在继承关系中(即在不同作用域内,一个在父类一个在子类),函数名、形参个数、形参类型、返回值类型都相同并且父类中带有virtual关键字,将原来的函数重写一遍,只不过函数的内容被更新。
覆盖/隐藏
- 覆盖是发生在继承关系中(即在不同作用域内,一个在父类一个在子类),子类继承父类,子类中有与父类相同的属性和方法时,子类会将父类相同的属性和方法给覆盖或隐藏。
覆盖/隐藏与重载、重写区别
- 与重载范围不同:隐藏函数和被隐藏函数在不同类中。
- 参数的区别:隐藏函数和被隐藏函数参数列表可以相同,也可以不同,但函数名一定相同。
重载与重写区别
- 定义不同:重载是定义相同的方法名,参数不同;重写是子类重写父类的方法。
- 范围不同:重载是在一个类中,重写是子类与父类之间的。
- 多态不同:重载是编译时的多态性,重写是运行时的多态性。
- 返回不同:重载对返回类型没有要求,而重写要求返回类型,有兼容的返回类型。
- 参数不同:重载的参数个数、参数类型、参数顺序可以不同,而重写父子方法参数必须相同。