--------------- FKBase.h ---------------
#import
<Foundation/Foundation.h>
@interface
FKBase : NSObject
- ( void ) base;
- ( void ) test;
- ( void ) base;
- ( void ) test;
@end
--------------- FKBase.m ---------------
#import
"FKBase.h"
@implementation
FKBase
- ( void ) base
{
- ( void ) base
{
NSLog(@"父类的普通base方法");
}
- ( void ) test
{
- ( void ) test
{
NSLog(@"父类的将被覆盖的test方法");
}
@end
--------------- FKSubclass.h ---------------
#import
<Foundation/Foundation.h>
#import
"FKBase.h"
@interface
FKSubclass : FKBase
- ( void ) sub;
- ( void ) sub;
@end
--------------- FKSubclass.m ---------------
#import
"FKSubclass.h"
@implementation
FKSubclass
- ( void ) test
{
- ( void ) test
{
NSLog(@"子类的覆盖父类的test方法");
}
- ( void ) sub
{
- ( void ) sub
{
NSLog(@"子类的sub方法");
}
@end
---------------
main.m
---------------
#import
<Foundation/Foundation.h>
#import "FKSubclass.h"
int main()
{
// 下面编译时类型和运行时类型完全一样,因此不存在多态
FKBase* bc = [[FKBase alloc] init];
// 下面两次调用将执行 FKBase 的方法
[bc base];
[bc test];
// 下面编译时类型和运行时类型完全一样,因此不存在多态
FKSubclass* sc = [[FKSubclass alloc] init];
// 下面调用将执行从父类继承到的 base 方法
[sc base];
// 下面调用将执行子类重写的 test 方法
[sc test];
// 下面调用将执行子类定义的 sub 方法
[sc sub];
// 下面编译时类型和运行时类型不一样,多态发生
FKBase* ploymophicBc = [[FKSubclass alloc] init];
// 下面调用将执行从父类继承到的 base 方法
[ploymophicBc base];
// 下面调用将执行子类重写的 test 方法
[ploymophicBc test];
// 因为 ploymophicBc 的编译类型是 FKBase
// FKBase 类没有提供 sub 方法 , 所以下面代码编译时会出现错误。
#import "FKSubclass.h"
int main()
{
// 下面编译时类型和运行时类型完全一样,因此不存在多态
FKBase* bc = [[FKBase alloc] init];
// 下面两次调用将执行 FKBase 的方法
[bc base];
[bc test];
// 下面编译时类型和运行时类型完全一样,因此不存在多态
FKSubclass* sc = [[FKSubclass alloc] init];
// 下面调用将执行从父类继承到的 base 方法
[sc base];
// 下面调用将执行子类重写的 test 方法
[sc test];
// 下面调用将执行子类定义的 sub 方法
[sc sub];
// 下面编译时类型和运行时类型不一样,多态发生
FKBase* ploymophicBc = [[FKSubclass alloc] init];
// 下面调用将执行从父类继承到的 base 方法
[ploymophicBc base];
// 下面调用将执行子类重写的 test 方法
[ploymophicBc test];
// 因为 ploymophicBc 的编译类型是 FKBase
// FKBase 类没有提供 sub 方法 , 所以下面代码编译时会出现错误。
// [ploymophicBc sub];
//
可将任何类型的指针变量赋值给
id
类型的变量
id dyna = ploymophicBc;
[dyna sub];
id dyna = ploymophicBc;
[dyna sub];
}
一、编写本节代码的具体步骤:
1.可仿照第二章001节的代码编写步骤,不同的是,本节代码要创建两个类。
二、本节代码涉及到的知识点:
1.OC指针类型的变量有两个,一个是编译时的类型,一个是运行时的类型。
2.编译时的类型,由声明该变量时使用的类型决定。
3.运行时的类型,由实际赋给该变量的对象决定。
4.如果编译时类型和运行时类型不一致,就可能出现多态。
5.上面的代码中,ploymophicBc是一个指针变量,它在编译时的类型是FKBase,
而运行时的类型是FKSubclass。当调用该指针的test方法时,实际执行的将是子类中重写的方法。
6.id类型的变量可以调用该变量实际所指对象的方法。所以上面代码中的最后一句可以执行。