WEB开发网
开发学院软件开发VC ATL布幔之下的秘密 阅读

ATL布幔之下的秘密

 2006-07-22 22:55:08 来源:WEB开发网   
核心提示: 程序10. #include <iostream>using namespace std;class Class {virtual void fun() { cout << "Class::fun" << endl; }};typed

程序10. #include <iostream>
using namespace std;
class Class {
 virtual void fun() { cout << "Class::fun" << endl; }
};
typedef void (*Fun)(void);
int main() {
 Class objClass;
 cout << "Address of virtual pointer " << (int*)(&objClass+0) << endl;
 cout << "Value at virtual pointer i.e. Address of virtual table "
   << (int*)*(int*)(&objClass+0) << endl;
 cout << "Value at first entry of virtual table "
   << (int*)*(int*)*(int*)(&objClass+0) << endl;
 cout << endl << "Executing virtual function" << endl << endl;
 Fun pFun = (Fun)*(int*)*(int*)(&objClass+0);
 pFun();
 return 0;
}
这个程序中有一些使用了类型转换的间接调用,其中最重要的一行是: Fun pFun = (Fun)*(int*)*(int*)(&objClass+0);在这里,Fun为一个由typedef定义的函数指针类型: typedef void (*Fun)(void);让我们来剖析一下这个冗长的间接调用。(int*)(&objClass+0)给出了虚函数表指针的地址,这个虚函数表指针是类的第一个入口,我们将它转换为了int*。要获得这个地址的值,我们需要使用间接调用运算符(也就是*),然后将它再次转换为int*,也就是(int*)*(int*)(&objClass+0)。这就会给出虚函数表的第一个入口。要获得这个位置的值,也就是获得类中第一个虚函数的地址,我们需要再次使用间接调用运算符,并将其转换为合适的函数指针类型,所以 Fun pFun = (Fun)*(int*)*(int*)(&objClass+0);就表示从虚函数表的第一个入口获得值,作Fun的类型转换,并将其存入pFun之中。

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:ATL 之下 秘密

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接