C++多态技术的实现和反思
本文来自: 编程入门网 http://www.bianceng.cn/Programming/cplus/zl/200801/6479.htm
面向对象技术最早出现于 1960 年代的 Simula 67 系统,并且在 1970 年代保罗阿托实验室开
发的 Smalltalk 系统中发展成熟。然而对于大部分程序员来说,C++是第一个可用的面向对
象程序设计语言。因此,我们关于面向对象的很多概念和思想直接来自于 C++。但是,C+
+在实现面向对象中关键的多态性时,选择了与 Smalltalk 完全不同的方案。其结果是,尽
管在表面上两者都实现了相似的多态性,但是在实践中却有着巨大的区别。具体的说, C+
+的多态性实现更加高效,但是并不适用于所有场合。很多经验不足的 C++开发者不明白
这个道理,在不合适的场合强行使用 C++的多态性机制,落入削足适履的陷阱而不能自拔。
本文将详细探讨 C++多态性技术的局限性及解决的办法。
两种不同虚方法调用实现技术
C++的多态性是 C++实现面向对象技术的基础。具体的说,通过一个指向基类的指针
调用虚成员函数的时候,运行时系统将能够根据指针所指向的实际对象调用恰当的成员函
数实现。如下所示:
class Base {
public:
virtual void vmf() { ... }
};
class Derived : public Base {
public:
virtual void vmf() { ... }
};
Base* p = new Base();
p->vmf(); // 这里调用 Base::vmf
p = new Derived();
p->vmf(); // 这里调用
// Derived::vmf
...
请注意代码中突出注释的两行,虽然其表面语法完全相同,但是却分别调用了不同的
函数实现。所谓的“多态”即就此而言。这些知识是每一个 C++开发者都熟知的。
现在我们假设自己是语言的实现者,我们应当如何来实现这种多态性?稍加思考,我
们不难得到一个基本的思路。多态性的实现要求我们增加一个间接层,在这个间接层中拦
截对于方法的调用,然后根据指针所指向的实际对象调用相应的方法实现。在这个过程中
我们人为增加的这个间接层非常重要,它需要完成以下几项工作:
1. 获知方法调用的全部信息,包括被调用的是哪个方法,传入的实际参数有哪些。
2. 获知调用发生时指针(引用)所指向的实际对象。---www.bianceng.cn