分派是一个过程,这个过程用来确定应用场景中具体使用的是哪个方法函数,比如在代码中可以有n个重名的甚至重参数的方法,那么具体使用的是哪个函数呢,这个对函数的确认过程即分派。
那么分派的准则是什么呢?是宗量,一个方法所属的对象叫做方法的接收者,方法的接收者与方法的参量统称做方法的宗量。在此基础上,分派分为单分派和多分派两种。
单分派根据一个宗量类型对方法进行选择,多分派(双分派)根据多个(两个)宗量对方法进行选择。
而目前的高级语言大都是单分派语言(c++/java/c#),具体分派方式根据阶段又分为两种:
一种是静态分派,即方法的分派发生在代码的编译阶段,对应的实现技术为函数重载,这时编译器只根据重名方法的不同参数来判断具体使用哪个方法。也就是我们所说的编译时多态。
一种是动态分派,即方法的分派发生在代码的执行阶段,对应的实现技术为函数重写,这时程序里只根据函数具体接收者来判断具体使用哪个类的方法。也就是我们所说的运行时多态。动态分派是根据运行时具体实际参数的类型来判断调用哪个函数的。这里多说一嘴,其实函数的具体接收者本质也是一个参数,参数的名称为this。
也就是说我们平时使用面向对象的继承、派生、多态特性即可满足我们大部分的工作需要,但是双分派的作用也是相当大的,你给函数参数传入的是基类指针(c++),双分派能根据实际指向的派生类的类型来选择具体使用哪个函数,然而c++、java等高级语言都没有实现,我们来看看静态分派,动态分派,双分派(c++虽然没有实现,但是我们也把期望的代码写了出来)的具体应用:
//Problem.h
class CProblem
{
public:
CProblem(void){}
virtual ~CProblem(void){}
void comm_func();
void comm_func(int a);
};
//Problem.cpp
#include <stdio.h>
#include "Problem.h"
void CProblem::comm_func()
{
printf("problem common function 1 in \n");
}
void CProblem::com