文章摘要
多态性是C++最主要的特征,多态性的实现得益于C++中的动 态联编技术。文章通过对动态联编的关键技术虚拟函数表进行深入的剖析,解析 的动态联编的过程极其技术要领。
关键字
多态性 动态联编 VTABLE 虚函数
文章正文
一 从多态性谈动态联编的必要性
在进入主题之前先介绍一下联编的概念。联编就是将模块或者函数合并在一起生 成可 执行代码的处理过程,同时对每个模块或者函数调用分配内存地址,并且对 外部访问也分配正确的内存地址。按照联编所进行的阶段不同,可分为两种不同 的联编方法:静态联编和动态联编。在编译阶段就将函数实现和函数调用关联起 来称之为静态联编,静态联编在编译阶段就必须了解所有的函数或模块执行所需 要检测的信息,它对函数的选择是基于指向对象的指针(或者引用)的类型。反 之在程序执行的时候才进行这种关联称之为动态联编,动态联编对成员函数的选 择不是基于指针或者引用,而是基于对象类型,不同的对象类型将做出不同的编 译结果。C语言中,所有的联编都是静态联编。C++中一般情况下联编也是静态联 编,但是一旦涉及到多态性和虚函数就必须使用动态联编。
多态性是面向 对象的核心,它的最主要的思想就是可以采用多种形式的能力,通过一个用户名 字或者用户接口完成不同的实现。通常多态性被简单的描述为"一个接口, 多个实现。在C++里面具体的表现为通过基类指针访问派生类的函数和方法。
下面我们看一个静态联编的例子,这种静态联编导致了我们不希望的结果 。
//1.cpp
1.#include <iostream.h>
2.class shape{
3.public:
4.void draw(){cout<<"I am shape"<<endl;}
5.void fun(){draw();}
6.};
7.class circle:public shape{
8.public:
9.void draw() {cout<<"I am circle"<<endl;}
10.};
11.main(){
12.class circle oneshape;
13.oneshape.fun();
14.}