------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1.多态的基本概念
某一类事物的多种形态
2.多态的体现
Person *p = [Studentnew];
p->age = 100;
[p walk];
- 子类对象赋值给父类指针
- 父类指针访问对应的属性和方法
3.多态的好处
用父类接收参数,节省代码
4.多态的局限性
不能访问子类的属性(可以考虑强制转换)
5.多态的细节
动态绑定:在运行时根据对象的类型确定动态调用的方法
6.多态的示例代码
#import <Foundation/Foundation.h>
/*
多态
1.没有继承就没有多态
2.代码的体现:父类类型的指针指向子类对象
3.好处:如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象
4.局限性:
1> 父类类型的变量 不能 直接调用子类特有的方法。必须强转为子类类型变量后,才能直接调用子类特有的方法
*/
// 动物
@interface Animal : NSObject
- (void)eat;
@end
@implementation Animal
- (void)eat
{
NSLog(@"Animal-吃东西----");
}
@end
// 狗
@interface Dog : Animal
- (void)run;
@end
@implementation Dog
- (void)run
{
NSLog(@"Dog---跑起来");
}
- (void)eat
{
NSLog(@"Dog-吃东西----");
}
@end
// 猫
@interface Cat : Animal
@end
@implementation Cat
- (void)eat
{
NSLog(@"Cat-吃东西----");
}
@end
// 如果参数中使用的是父类类型,可以传入父类、子类对象
void feed(Animal *a)
{
[a eat];
}
int main()
{
// NSString *d = [Cat new];
// [d eat];
/*
Animal *aa = [Dog new];
// 多态的局限性:<strong><span style="color:#ff0000;">父类类型的变量 不能 用来调用子类的方法</span></strong>
//[aa run];
// 将aa转为Dog *类型的变量
Dog *dd = (Dog *)aa;
[dd run];
*/
//Dog *d = [Dog new];
//[d run];
/*
Animal *aa = [Animal new];
feed(aa);
Dog *dd = [Dog new];
feed(dd);
Cat *cc = [Cat new];
feed(cc);
*/
/*
// NSString *s = [Cat new];
Animal *c = [Cat new];
NSObject *n = [Dog new];
NSObject *n2 = [Animal new];
// 多种形态
//Dog *d = [Dog new]; // Dog类型
// 多态:父类指针指向子类对象
Animal *a = [Dog new];
// <span style="color:#ff0000;">调用方法时会检测对象的真实形象</span>
[a eat];
*/
return 0;
}