多态的概念
不同的对象以自己的方法相应父类同名的方法,这就是多态
体现:
父类指针指向子类对象
多态的条件
1.有继承关系
2.有方法重写(子类把父类的同名方法重写)
课堂练习的代码
Animal *ani = [Animal new];//对象爷爷
[ani run];
Dog *d1 = [Dog new];//正常使用,爸爸
[d1 run];
Cat *cat = [Cat new];//正常使用,叔叔
[cat run];
//使用多态是,父类指针指向子类对象
Animal *a2 = [Dog new];//可以指向子类,也可以指向孙子类,例如声明一个其他的类,是Dog的子类的时候就可以,运行的时候结果是孙子类的方法,这就是多态,都是爷爷类型的指针但是运行的方法却是不同儿子孙子的方法
[a2 run];
多态:当子类的方法和父类的方法不是同名的情况,以上代码是同名的情况(编译器能找到run方法,因为声明的Animal类型里面有run方法).但是当子类有自己独特的方法时候
声明一个多态
例如:Animal *a3 = [Dog new];
这时候回编译错误,eat是Dog 的私有方法。但是这时候a3又是指向Dog类的,所以地址是可以访问过去的,这时候可以这样写
[a3 eat]错误
[(Dog *)a3 eat]; 这样就是正确的了,把a3强制转换成Dog类型,这时候就可以运行eat Dog类的私有方法了
注意编译器找声明类型的.h方法有没有。运行的时候找实际new出来的地址