静态多态和动态多态:
多态性:相同的消息请求执行不同的代码体,从而有不同的行为后果
静态多态:根据目标对象的静态类型和参数表中参数的静态类型确定目标代码体
1.模板—不同的模板参数
2.函数重载
动态多态:1.根据目标对象的动态类型和参数表中参数的静态类型确定目标代码体(虚机制)
2.根据目标对象的动态类型和参数表中参数的动态类型确定目标代码体(c++不支持)
虚机制的作用:
一种实现动态多态的方法
在保持客户端访问接口不变的前提下,变更类的实现
通过子类型化,适应变化
Parent* p=new child; //Praent是父类,child是子类
p->Func(); //可以把上面的child改成别的子类,而这个代码不需要改变
child my;
Parent & obj=my;
obj.Func();
void Proc(Parent* p){
p->Func();
}
应用例:
1.父类提供接口,子类提供具体实现
2.父类提供框架,子类提供细节
3.虚拟的构造函数
虚机制的不足:
只使用虚机制,难以适应多个方向的变化
class Parent{
public:
virtual ~Parent();
virtual void F();
virtual void G();
virtual void H();
//.......................
};
/* 如果F()有两种不同的实现变化,G()有三种不同的实现变化
H()有四种不同的实现变化
那么需要派生24个子类
*/
所以通常使用水平(依赖+关联)+继承
class Parent{
public:
Parent(F*,G*,H*);
virtual ~Parent();
void F(){pF->F()}
void G(){pG->G()}
void H(){pH->H()}
private:
F* pF;
G* pG;
H* pH;
};
class F{
public:
virtual ~F(){}
virtual void F(){
.......................
}
};
class G{
public:
virtual ~G(){}
virtual void G(){
.......................
}
};
class H{
public:
virtual ~H(){}
virtual void H(){
.......................
}
};
这样就只需要2+3+4个派生类
将一个类的多个方向用水平关系变成了多个类的单个方向