Object-c 里面的指针类型有两种
1、编译时的类型,由申明该变量时使用的类型决定
2、运行时的类型,由运行时实际付给该变量的对象决定
如果编译时和运行时的类型不一致,就可能出现多态(Polymorphism)。
#import <Foundation/Foundation.h>
@interface DCBase : NSObject
-(void) base ;
-(void) test ;
@interface DCBase : NSObject
-(void) base ;
-(void) test ;
@end
@interface DCSubclass : DCBase
-(void) test
;
-(void) sub ;
@end
#import "DCBase.h"
@implementation DCBase
-(void) base
{
NSLog(@"父类的普通base方法");
{
NSLog(@"父类的普通base方法");
}
-(void) test
{
NSLog(@"父类将被覆盖的test方法");
{
NSLog(@"父类将被覆盖的test方法");
}
@end
@implementation DCSubclass
- (void) test
{
NSLog(@"子类的覆盖父类的test方法");
}
- (void)
sub
{
NSLog(@"子类的sub方法");
{
NSLog(@"子类的sub方法");
}
@end
//
// main.m
// Polymorphism
//
// Created by mac on 14-11-29.
// Copyright (c) 2014年 mac. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "DCBase.h"
#import "DCSubclass.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, Polymorphism!");
DCBase* bc = [[DCBase alloc] init];
// 下面两次调用将执行BaseClass的方法
[bc base];
[bc test];
// 下面编译时类型和运行时类型完全一样,因此不存在多态
DCSubclass* sc = [[DCSubclass alloc] init];
// 下面调用将执行从父类继承到的base方法
[sc base];
// 下面调用将执行子类重写的test方法
[sc test];
// 下面调用将执行子类定义的sub方法
[sc sub];
// main.m
// Polymorphism
//
// Created by mac on 14-11-29.
// Copyright (c) 2014年 mac. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "DCBase.h"
#import "DCSubclass.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, Polymorphism!");
DCBase* bc = [[DCBase alloc] init];
// 下面两次调用将执行BaseClass的方法
[bc base];
[bc test];
// 下面编译时类型和运行时类型完全一样,因此不存在多态
DCSubclass* sc = [[DCSubclass alloc] init];
// 下面调用将执行从父类继承到的base方法
[sc base];
// 下面调用将执行子类重写的test方法
[sc test];
// 下面调用将执行子类定义的sub方法
[sc sub];
// 下面编译时类型和运行时类型不一样,多态发生.编译时类型为DCBase,运行时类型则
//是DCSubclass,调用该对象的test方法时
//实际调用了DCSubclass中的test方法。
DCBase* ploymophicBc = [[DCSubclass alloc] init];
// 下面调用将执行从父类继承到的base方法
[ploymophicBc base];
// 下面调用将执行子类重写的test方法
[ploymophicBc test];
// 因为ploymophicBc的编译类型是DCBase
// DCBase类没有提供sub方法,所以下面代码编译时会出现错误。
[ploymophicBc sub];
// 可将任何类型的指针变量赋值给id类型的变量
id dyna = ploymophicBc;
[dyna sub];
id mba = sc ;
[mba sub];
}
return 0;
DCBase* ploymophicBc = [[DCSubclass alloc] init];
// 下面调用将执行从父类继承到的base方法
[ploymophicBc base];
// 下面调用将执行子类重写的test方法
[ploymophicBc test];
// 因为ploymophicBc的编译类型是DCBase
// DCBase类没有提供sub方法,所以下面代码编译时会出现错误。
[ploymophicBc sub];
// 可将任何类型的指针变量赋值给id类型的变量
id dyna = ploymophicBc;
[dyna sub];
id mba = sc ;
[mba sub];
}
return 0;
}