1、多态(多种形态)。实现多态的前提是实现继承,没有继承就没有多态。因为多态的体现形式就是父类指针指向子类对象。常用这种方式:父类名 *p=[子类名 new];
2、利用多态,指向子类对象的父类指针能直接调用子类中重写父类的方法。当给指向子类对象的父类指针发送消息时,系统会启动动态检测来判断对象的真实类型,进而调用这个真实类型的方法。
3、多态的好处:首先在一个函数中有一个父类指针类型的形参,这就意味着可以传入父类以及所有子类的对象。当这个父类指针的形参在函数体内调用被所有子类重写的方法时,传入的是哪个父类对象就能调用哪个父类对象的方法,传入哪个子类的对象就能调用哪个子类的方法。从而使用不变的代码可以实现不同的操作,节省了代码。
4、所有的OC方法都是默认为虚函数。
5、多态的限制:不能使用指向子类对象父类指针来调用子类扩展的方法(父类中没有的方法),因为OC是弱语法,所以仅仅是警告,仍然能运行成功,但是不建议这么做。
6、多态限制的解决方法:如果想用指向子类对象的父类指针来调用子类扩展的成员方法,可以用强制转换类型的方法。这时可以把指向子类对象的父类指针强制转换为相应的子类指针,这样就可以直接调用子类扩展的方法了。格式如下:
Animal *aa=[Dog new]; Dog *dd=(Dog *)aa;
转换语法:{ 相应子类名 * p=(父类名 *)指向子类对象的父类指针;}
类型转换是做给编译器看的。