C++语言程序设计

11.2.3 多态的实现
这一部分，我们简要地介绍一下在C++中多态是怎样实现的。
多态的基本思想是：在编译时，C++编译器不知道调用哪一个函数，而要到运行时确定。这意味着应把函数的入口地址保存在某一个地方，以便于在调用前查询，而存储函数入口地址的地方也应能被相关的对象访问。例如，一个Vehicle * unicycle指针指向car对象，然后，unicycle->message()调用car的成员函数，这个函数的入口地址由unicycle指向的对象决定。
在C++中，一般实现方法如下：包含虚函数的对象，增加了一个隐含的数据成员，且是它的第一个数据成员，该数据成员指向一个指针数组，而指针数组存储对象的虚函数地址，需要说明的是这个实现与具体的编译器有关。
某一个类的虚函数地址表被该类的所有对象共享，甚至有可能两个类共享同一个虚函数地址表。内存开销包括：
◇ 每一个对象增加了一个额外的数据成员。
◇ 每一个类有一个指针表，用于存储该类各虚函数的地址。
所以，unicycle->message()的调用过程是：首先检查unicycle指向的对象的隐含的数据成员，在我们前面所举的例子中，该数据成员指向的指针表只有一个元素，即message函数的入口地址，被调用的函数根据指针表确定。
有虚函数的的对象的内部组织，我们可以用11-4的示意图来说明：
正象我们在图11-4中看到的，有虚函数的所有对象均有一个隐含的指针数据成员，且指向存放虚函数入口地址的指针表。类Vehicle对象与truck对象共用一个表，而car和boat有自己的message函数，所以，它们需要自己的虚函数指针表。