
1.多态的基本概念
某一类事物的多种形态
OC对象具有多态性
2.多态的体现
Person *p = [Student new];
p->age = 100;
[p walk];
子类对象赋值给父类指针
父类指针访问对应的属性和方法
3.多态的好处
用父类接收参数,节省代码
4.多态的局限性
不能访问子类的属性(可以考虑强制转换)
5.多态的细节
动态绑定:在运行时根据对象的类型确定动态调用的方法
6.代码
1 #import <Foundation/Foundation.h>
2
3 /*
4 多态
5 1.没有继承就没有多态
6 2.代码的体现:父类类型的指针指向子类对象
7 3.好处:如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象
8 4.局限性:
9 1> 父类类型的变量 不能 直接调用子类特有的方法。必须强转为子类类型变量后,才能直接调用子类特有的方法
10 */
11
12 // 动物
13 @interface Animal : NSObject
14 - (void)eat;
15 @end
16
17 @implementation Animal
18 - (void)eat
19 {
20 NSLog(@"Animal-吃东西----");
21 }
22 @end
23
24 // 狗
25 @interface Dog : Animal
26 - (void)run;
27 @end
28
29 @implementation Dog
30 - (void)run
31 {
32 NSLog(@"Dog---跑起来");
33 }
34 - (void)eat
35 {
36 NSLog(@"Dog-吃东西----");
37 }
38 @end
39
40 // 猫
41 @interface Cat : Animal
42
43 @end
44
45 @implementation Cat
46 - (void)eat
47 {
48 NSLog(@"Cat-吃东西----");
49 }
50 @end
51
52 // 这个函数是专门用来喂动画
53 //void feed(Dog *d)
54 //{
55 // [d eat];
56 //}
57 //
58 //void feed2(Cat *c)
59 //{
60 // [c eat];
61 //}
62 //
63
64 // 如果参数中使用的是父类类型,可以传入父类、子类对象
65 void feed(Animal *a)
66 {
67 [a eat];
68 }
69
70 int main()
71 {
72 // NSString *d = [Cat new];
73 // [d eat];
74
75 /*
76 Animal *aa = [Dog new];
77 // 多态的局限性:父类类型的变量 不能 用来调用子类的方法
78 //[aa run];
79
80 // 将aa转为Dog *类型的变量
81 Dog *dd = (Dog *)aa;
82
83 [dd run];
84 */
85
86 //Dog *d = [Dog new];
87
88 //[d run];
89
90 /*
91 Animal *aa = [Animal new];
92 feed(aa);
93
94 Dog *dd = [Dog new];
95 feed(dd);
96
97 Cat *cc = [Cat new];
98 feed(cc);
99 */
100
101 /*
102 // NSString *s = [Cat new];
103 Animal *c = [Cat new];
104
105
106 NSObject *n = [Dog new];
107 NSObject *n2 = [Animal new];
108
109
110 // 多种形态
111 //Dog *d = [Dog new]; // Dog类型
112
113 // 多态:父类指针指向子类对象
114 Animal *a = [Dog new];
115
116 // 调用方法时会检测对象的真实形象
117 [a eat];
118 */
119 return 0;
120 }