多态是一种程序语言的特性,他符合人类的思考方式,再加上对象的概念,显得更加自然。但是再仔细去琢磨一下多态,特别是OOP中的多态,这种多态到底为程序员掩盖了什么呢?当定义 ClassA a = new ClassB() 的时候,我们很清楚的知道调用a的某个方法其实是在调用ClassB的方法(当然这个方法要被重载,在C++中还必须是virtual)。这是我们人类的思考方式,计算机也这样思考的吗?显然答案是:NO
计算机的大脑(Central Process Unit,CPU)远没有人类大脑那么复杂,它没有思考能力,没有抽象能力,没有推理能力,它所具有的能力就是认识几百条指令[1],并且能处理这些指令,而且是以非常非常快的速度处理这些指令,但是这些指令对人类来说又显得那么繁琐。例如1+2=3,多么简单,但对CPU来说,却没那么简单,它要通过以下步骤来完成:
1: LOAD 指令到寄存器(由操作符(+)和两个操作数(1,2)的地址组成)
2: LOAD 操作数1到寄存器(根据地址)
3: LOAD 操作数2到寄存器(根据地址)
4: ADD 执行加法,并且把结果写到一个寄存器中
5: MOV 把寄存器中的结果写回内存
这还只是CPU执行的过程,在此之前还有很多工作要做,例如把1+2=3编译成CPU认识的指令,把指令加载到内存 等等。这么简单的大脑怎么去思考多态呢?
CPU的可贵之处就在于它的简单(简简单单才是福),它为人类丰富的想象空间提供了基石。CPU最主要的两个寄存器:IR(Instructor Register)和PC(Program Counter)。CPU在运行的时候一直在做这样一个重复的动作:
1: 加载PC指向的指令到IR
2: PC指向下一条指令
3: 执行IR中的指令
在第三步中执行的指令有可能修改PC中指向的地址,这样就实现程序的跳转。这时再和上面的多态结合在一起,多态就是在运行(不是编译时决定的)的时候去决定下一个要调用的方法,那就可以通过修改PC指向的指令来完成(我的猜测),这中间当然还需要很多很多繁琐的过程和很多很多实现细节,C++[2]中的vtable[3]也许能告诉我们这些细节。
[1] http://developer.intel.com/design/pentium/manuals/243191.htm
[2] http://www.research.att.com/~bs/C++.html
[3] http://www.informit.com/articles/article.aspx?p=26063
计算机的大脑(Central Process Unit,CPU)远没有人类大脑那么复杂,它没有思考能力,没有抽象能力,没有推理能力,它所具有的能力就是认识几百条指令[1],并且能处理这些指令,而且是以非常非常快的速度处理这些指令,但是这些指令对人类来说又显得那么繁琐。例如1+2=3,多么简单,但对CPU来说,却没那么简单,它要通过以下步骤来完成:
1: LOAD 指令到寄存器(由操作符(+)和两个操作数(1,2)的地址组成)
2: LOAD 操作数1到寄存器(根据地址)
3: LOAD 操作数2到寄存器(根据地址)
4: ADD 执行加法,并且把结果写到一个寄存器中
5: MOV 把寄存器中的结果写回内存
这还只是CPU执行的过程,在此之前还有很多工作要做,例如把1+2=3编译成CPU认识的指令,把指令加载到内存 等等。这么简单的大脑怎么去思考多态呢?
CPU的可贵之处就在于它的简单(简简单单才是福),它为人类丰富的想象空间提供了基石。CPU最主要的两个寄存器:IR(Instructor Register)和PC(Program Counter)。CPU在运行的时候一直在做这样一个重复的动作:
1: 加载PC指向的指令到IR
2: PC指向下一条指令
3: 执行IR中的指令
在第三步中执行的指令有可能修改PC中指向的地址,这样就实现程序的跳转。这时再和上面的多态结合在一起,多态就是在运行(不是编译时决定的)的时候去决定下一个要调用的方法,那就可以通过修改PC指向的指令来完成(我的猜测),这中间当然还需要很多很多繁琐的过程和很多很多实现细节,C++[2]中的vtable[3]也许能告诉我们这些细节。
[1] http://developer.intel.com/design/pentium/manuals/243191.htm
[2] http://www.research.att.com/~bs/C++.html
[3] http://www.informit.com/articles/article.aspx?p=26063