1.1 C++(www.cppentry.com)对象模式(The C++(www.cppentry.com) Object Model)(3)
这个函数有可能在内部被转化为:
- // 可能的内部转换结果
- // 虚拟C++(www.cppentry.com)代码
- void foobar( X &_result )
- {
- //构造_result
- // _result 用来取代 local xx ...
- _result.X::X();
-
- // 扩展 X *px = new X;
- px = _new( sizeof( X ) );
- if ( px != 0 )
- px->X::X();
-
- // 扩展 xx.foo() 但不使用 virtual 机制
- // 以 _result 取代 xx
- foo( &_result );
-
- // 使用 virtual 机制扩展 px->foo()
- ( *px->vtbl[ 2 ] )( px )
-
- // 扩展 delete px;
- if ( px != 0 ) {
- ( *px->vtbl[ 1 ] )( px ); // destructor
- _delete( px );
- }
-
- // 无须使用 named return statement
- // 无须摧毁 local object xx
- return;
- };
喔,真是差异颇大,不是吗!当然,此刻你并不需要了解所有的转化过程及结果。我会在后继章节解释其中每一个操作的用意,以及为什么那么做。我想你会回头看,一边玩弄你的手指头,一边说"喔欧,是的,当然",同时奇怪你怎么会曾经迷惘过。
译注:我可以先用这张图解除你的部分疑惑。由于X有两个virtual functions,一个是destructor,一个是foo,所以X object布局如下:
前述程序代码中的px->_vtbl[0]指向X的type_info object,px->_vtbl[1]指向X::~X(),px->_vtbl[2]指向X::foo()。