【学习笔记】【OC语言】多态
2015-07-16 19:29
387 查看
1.多态的基本概念
某一类事物的多种形态
OC对象具有多态性
2.多态的体现
Person *p = [Student new];
p->age = 100;
[p walk];
子类对象赋值给父类指针
父类指针访问对应的属性和方法
3.多态的好处
用父类接收参数,节省代码
4.多态的局限性
不能访问子类的属性(可以考虑强制转换)
5.多态的细节
动态绑定:在运行时根据对象的类型确定动态调用的方法
6.代码
某一类事物的多种形态
OC对象具有多态性
2.多态的体现
Person *p = [Student new];
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(Dog *d) //{ // [d eat]; //} // //void feed2(Cat *c) //{ // [c eat]; //} // // 如果参数中使用的是父类类型,可以传入父类、子类对象 void feed(Animal *a) { [a eat]; } int main() { // NSString *d = [Cat new]; // [d eat]; /* Animal *aa = [Dog new]; // 多态的局限性:父类类型的变量 不能 用来调用子类的方法 //[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]; // 调用方法时会检测对象的真实形象 [a eat]; */ return 0; }
相关文章推荐
- C++两个类相互包含引用的问题
- C++构造函数
- C++静态成员的应用
- C++ const限定符
- C++ 虚函数及重载、重定义、重写
- c++中const用法总结
- C/C++之static
- 黑马程序员------C语言中交换两个变量的值
- C++之插入迭代器
- C++11之auto和decltype
- C++ 类型转换运算符
- C++之构造函数的继承
- C语言--程序设计基础——7、8章
- C++ 必须使用初始化列表
- C++ typeid
- C++全局函数与成员函数的区别
- 对dispatch_async到主线程的逻辑封装成C/C++接口类型
- C++ 连接Mysql数据库
- C++DLL
- 黑马程序员-C语言基础知识-运算符与表达式