C++的三大特性:封装、继承、多态。其中封装可以使得代码模块化;继承可以扩展原有的代码;多态则是为了接口重用。且设计模式都是基于C++的多态为前提的。
概念:
多态
多态性是允许将父对象设置成为和一个或者更多的它的子对象相等的技术。赋值之后,父对象就可以根据当前赋值给他的子对象的特性以不同的方式运作。
简单说:就是允许子类类型的指针赋值给父类类型的指针(一种接口,根据子类对象的不同而执行不同的行为)
C++支持的两种多态性:编译时多态性和运行时多态性。
a - 编译时多态性(静态多态):通过函数重载实现
b - 运行时多态(多态多态):通过虚函数实现。
多态的目的
多态的目的就是接口重用。也就是不论传递过来的究竟是哪个类的对象,函数都能通过同一个接口调用到适应各自的对象中的方法。
多态的实现
静态多态的实现依赖于函数重载,动态动态的实现依赖于虚函数。
重载的条件
- 函数名相同
- 函数形参不同,包括参数的类型、个数、顺序
- 函数的返回值不作为函数重载的条件
- 在一个命名空间或者是在同一个类中
Parent *cc = new Child();
cc->fun(10);//结果:Parent::virtual void fun(int a): a = 10
构成虚函数的条件
- 位于不同的类中,不在同一个类中
- 派生类和基类中的virtual函数要具有相同的函数原型即返回类型、函数名、形参个数、形参类型、形参顺序都要相同
- 在基类函数的声明的最开始部分加上关键字virtual
Parent *cc = new Child();
cc->fun();//结果:Child::virtual void fun(void)
另外一个蛋疼的问题(隐藏)
什么情况下会发生隐藏:
- 基类中的函数为非virtual函数,如果在派生类中有和基类相同的函数名,不管返回值和形参列表是否相同,都会导致基类中的所有的同名函数被派生类中的函数隐藏
- **基类中函数有virtual,如果派生类中存在和基类相同的函数名,但是形参列表不同,都会导致基类中所有的同名的virtual函数被派生类隐藏;
注意:如果派生类中的函数和基类中的同名的virtual函数具有相同的形参列表,但是唯独函数的返回值不同,这将不会隐藏基类中的函数,而是直接导致编译错误。