多态其实就是一种类的抽象,我们把某些有共性的对象进行抽象成为父类,然后再为每个不同对象赋予特定的属性。比如说猫狗什么,都可以抽象为宠物,然后你可以规定一些宠物的属性和方法,你想把它当猫就可以添加猫的特性,你想把它当狗就可以添加狗的特性,这样可以简化编程和清晰类结构。
那我们先说说C++的多态实现把
运行时多态需要使用虚函数实现
#include <iostream>
using namespace std;
class Parent
{
public:
int parent;
inline Parent(){}
inline Parent(int parent) { this->parent = parent; }
inline virtual void haveFun() { cout << "haveFun in Parent" << endl; }
};
class Child : public Parent
{
public:
int child;
inline Child(){}
inline Child(int child) : Parent(child + 1) { this->child = child; }
inline void haveFun() { cout << "haveFun in Child" << endl; }
};
int main(void)
{
Parent* p = new Child(2);
p->haveFun();
return 0;
}
结果
我们可以看到Child类中得haveFun被调用了。而父类的haveFun没有显示。
那我们看看ObjC中如何实现多态
#import "Parent.h"
@implementation Parent
- (id) init
{
if (self = [super init])
{
}
return self;
}
- (void) haveFun
{
NSLog(@"haveFun in Parent");
}
@end
#import "Parent.h"
@interface Child : Parent
@end
#import "Child.h"
@implementation Child
- (void) haveFun
{
<span style="white-space:pre"> </span>[super haveFun];
NSLog(@"haveFun in Child");
}
@end
Parent* p = [[Child alloc] init];
[p draw];
结果
haveFun in Parent
haveFun in Child
小结:
1.与C++ 的多态相比,在Objective-c中是没有virtual关键字的,默认情况下只要子类重写了父类的方法就实现了覆盖(这一点和java类似),在Objective-c中同一类中的函数是不能被重载的。
2.在Objective-c中,通过super关键字可以调用基类的函数,这个在C++中是没有的,在C++中可通过作用域运算符访问基类成员。