模拟虚函数?

类别:编程语言 点击:0 评论:0 推荐:
H1 { font-family : "Book Antiqua", "Georgia", "Tahoma", "Times New Roman", "Times", serif; color : #000000; font-size : 16pt; font-weight : bold; border-width : 0 0 3px; border-style : double; border-color : #9f9f9f; } H2 { font-family : "Arial", "Helvetica", sans-serif; color : #000000; font-size : 11pt; font-weight : normal; background-color : #eeeeee; padding-left : 4px; padding-top : 4px; padding-right : 4px; padding-bottom : 4px; border-style : solid; border-width : 1px; border-color : #9f9f9f; text-align : center; } H3 { font-family : "Book Antiqua", "Georgia", "Tahoma", "Times New Roman", "Times", serif; color : #000000; font-size : 11pt; font-weight : bold; } body { margin-left : 10%; margin-top : 10; margin-right : 10%; margin-bottom : 2; font-family :"Tahoma", "Times New Roman", "Times", serif; color : #000000; font-size : 11pt; scrollbar-face-color: #eeeeee; scrollbar-shadow-color: #9F9F9F; scrollbar-highlight-color: #eeeeee; scrollbar-3dlight-color: #9F9F9F; scrollbar-darkshadow-color: #FFFFFF; scrollbar-track-color: #FFFFFF; scrollbar-arrow-color: #000000; } p { font-size: 11pt; color: #000000; font-family: Georgia, Tahoma, 'Times New Roman' , Times, serif; } PRE { border-right: #9f9f9f 1pt solid; border-top: #9f9f9f 1pt solid; padding-left: 5pt; padding-bottom: 10pt; border-left: #9f9f9f 1pt solid; border-bottom: #9f9f9f 1pt solid; color: darkblue; padding-top: 10pt; font-family: 'Times New Roman'; background-color : #eeeeee; } HR { color: lightsteelblue; } td.general1 { background-color : #ffcc00; } td.general2 { background-color : #feeec0; } td.general3 { background-color : #DDEEFF; } a:link { color : #1507af; text-decoration : none; } a:visited { color : #1507af; text-decoration : none; } a:hover { color : #5547ef; text-decoration : none; } a:active { color : #4537df; text-decoration : none; } frameset { border-color : lightsteelblue; } 模拟虚函数?

近几天看《ATL INTERNALS》,看到了附录中的一个关于template的小技巧-仿真动态绑定:

template class Array { public: …… virtual int Compare(const Array& rhs) =0; bool operator< (const Array& rhs) { return this->Compare(rhs) < 0; } bool operator> (const Array& rhs) { return this->Compare(rhs) >0; } bool operator== (const Array& rhs) { return this->Compare(rhs) == 0; } T m_rg[1024]; };

然后派生类重写这个虚函数获得多态特性:

class String : public Array { public: int Compare(const Array& rhs) { return strcmp(m_rg, rhs.m_rg); } };

为了实现虚函数需要一个vptr和一个vtable,以及需要至少经过两次提领操作才能调用正确的函数。

然后书中介绍了一种提供效率的办法:

template <typename T, typename Deriving> class Array { public: …… bool operator< (const Array& rhs) { return static_cast(this)->Compare(rhs) < 0; } bool operator> (const Array& rhs) { return static_cast(this)->Compare(rhs) > 0; } bool operator== (const Array& rhs) { return static_cast(this)->Compare(rhs) == 0; } T m_rg[1024]; };

注意Array模板接受一个附加的参数——派生类的名字。它利用这个类名完成堆自己的静态强制转换。因为编译器会在实例化(具象化)派 生类的同时展开基类的代码,所以静态强制转换完成了一个完全安全的向下转换。

class String : public Array<char, String> { public: int Compare(const Array& rhs) { return strcmp(m_rg, rhs.m_rg); } };

这项技术在不使用虚成员的情况下使得我们看到并且感受到了动态绑定。真的有 那么神奇吗?虚函数真的可用通过模板来模拟?当然不是

一开始的时候我还觉得迷惑,但是隐约觉得这个东西只是看上去像虚函数,但是限制多多。于是上网去问高手。gigix一开始被我说晕了, 也怪我表述不好。问babysloth,一列出代码他就知道了这个是什么了。他说: “这叫curiously recurring template pattern, 由bell-lab的james coplien首先记录下来”

紧接着,我偶然看到以前下载的ATL相关技术解析的文章,里面详细说了这个东西。文章是Codeguru上的《ATL Under the Hood Part 3》。 简短的一个程序说明了这个东西:

#include using namespace std; class Base { public: virtual void fun() { cout

本文地址:http://com.8s8s.com/it/it29326.htm