object-c指针类型的变量有两个:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定,如果编译时类型和运行时类型不一致,就会出现多态。
子类是一种特殊的父类,object-c允许把一个子类对象直接复制给一个父类指针类型,无需任何类型转换。
父类* a=[[子类 alloc] init];
#import <Foundation/Foundation.h>
@interface Base:NSObject;
-(void) base;
-(void) test;
@end
#import <Foundation/Foundation.h>
#import "Base.h"
@implementation Base
-(void) base{}
-(void)test{}
@end
#import <Foundation/Foundation.h>
#import “Base.h”
@interface Subclass:Base
-(void) sub;
@end
#import<Foundation/Foundatation.h>
#import "Subclass.h"
int main(int arg,char*argv[]){
Base base=[[Base alloc] init];
[base base];
[base test];
Subclass* sub=[[Subclass alloc] init];
[sub base];
[sub test];
[sub sub]
//多态
Base* base1=[[Subclass alloc] init];
[base1 base];
[base1 test];
base1不可调用sub方法,因为其实Base对象,base没有这方法;
//多态2
id d=base1;
[d sub];
}
备注:id类型的变量可以被赋值为任意类型的对象或者任意类型的指针变量,而且使用id类型的变量可以调用该变量实际所指对象的方法
指针类型的强制类型转换
在object-C程序中,除了id类型的变量外,指针变量只能调用其编译时类型的方法,而不能调用其运行时类型的方法,即使其实际所指对象包含该方法,如果需要让这个指针变量调用其运行时类型的方法,必须强制转化编译时类型为运行时类型。方法和Java类型(子类型*)父类对象
NSObject* obj=@"hello";
NSString* s=(NSString*)obj;
判断指针变量的实际类型
-(BOOL)isMenberOfClass:class 判断该对象是否为class类的实例
-(BOOL)idKindOfClass:class 判断该对象是否为class类或者其子类的实例
+(BOOL)isSubclaaOfClass:clazz: 类方法 用以判断当前对象是否为class类子类。