黑马程序员学习笔记_OC之多态
1、 多态实质:父类指针指向子类对象,没有继承就没有多态
2、 实例:例如设计一个animal类,包括方法eat,输出“animal eat---”。再设计一个dog类继承animal,重写eat方法,输出“dog eat-----”。可以采用如下代码实现对dog对象的调用。
Animal *a = [Dognew];
[a eat] ;
这样的话,输出的即为dog eat-----,说明调用的是dog的方法。原因是执行时会动态检测指针的真实类型。
3、 好处:在2的基础上再设计一个类cat继承animal,重写eat方法,输出“cat eat----”,再设计一个函数feed函数如下:
void feed (dog*d)
{
[d eat];
}
这个函数可以执行dog吃的动作,但是不能执行cat吃东西的动作,如果想在主函数中调用让cat吃东西的话,还要设计一个函数如下:
void feed2 (cat*c)
{
[c eat];
}
这样在主函数中写入如下代码:
Dog *dd = [Dognew];
Cat *cc = [Catnew];
feed(dd);
feed(cc);
这样才能成功调用猫和狗的吃。
使用多态可以节省上述编法代码,实例如下:
4、多态局限性:如果上述例子的狗类中多加一个对象方法run,执行如下代码:
Animal *a = [Dognew];
[a run];
执行上述代码时发现有警告但能运行,我们规定不能这样写。这是多态的局限性:父类类型的指针不能用来调用子类的特有方法。如果实在想调用可以用强制转换的方法实现,代码如下:
Animal *a = [Dognew];
Dog *d = [Dog *]a;
[d run];
即必须转化为子类类型指针变量。