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

ATL布幔之下的秘密

 2006-07-22 22:55:08 来源:WEB开发网   
核心提示: 当虚函数加入到这个派对中的时候,一切就变得都有意思了,ATL布幔之下的秘密(2),请看下面的程序:程序4. #include <iostream>using namespace std;class Class {public:virtual void fun() { cout

当虚函数加入到这个派对中的时候,一切就变得都有意思了。请看下面的程序:

程序4. #include <iostream>
using namespace std;
class Class {
public:
 virtual void fun() { cout << "Class::fun" << endl; }
};
int main() {
 Class objClass;
 cout << "Size of Class = " << sizeof(objClass) << endl;
 cout << "Address of Class = " << &objClass << endl;
 return 0;
}
程序的输出为:Size of Class = 4
Address of Class = 0012FF7C
并且,在我们添加了多于一个的虚函数之后,会变得更加有趣:

程序5. #include <iostream>
using namespace std;
class Class {
public:
 virtual void fun1() { cout << "Class::fun1" << endl; }
 virtual void fun2() { cout << "Class::fun2" << endl; }
 virtual void fun3() { cout << "Class::fun3" << endl; }
};
int main() {
 Class objClass;
 cout << "Size of Class = " << sizeof(objClass) << endl;
 cout << "Address of Class = " << &objClass << endl;
 return 0;
}
这个程序的输出和前一个程序一模一样,让我们再做一个实验来更好地弄懂这件事吧。

程序6. #include <iostream>
using namespace std;
class CPoint {
public:
 int m_ix;
 int m_iy;
 virtual ~CPoint() { } // 译注:原文此处有分号,我将其去掉,下皆同
};
int main() {
CPoint objPoint;
cout << "Size of Class = " << sizeof(objPoint) << endl;
cout << "Address of Class = " << &objPoint << endl;
return 0;
}
程序的输出为:Size of Class = 12
Address of Class = 0012FF68
这些程序的输出表明,当你向类中添加了虚函数之后,那么它的尺寸就会增加一个int的大小。在Visual C++中也就是增加4个字节。这就意味着这个类中有三个整数大小的位置,一个是x,一个是y,另一个是处理虚函数之用的虚函数表指针。首先,让我们来看看这个新的位置,也就是这个位于对象首部(或末尾)的虚函数表指针。要这么做的话,我们需要直接存取对象所占用的内存。我们可以使用神奇的指针技术,即用一个指向int的指针来存储一个对象的地址。

上一页  1 2 3 4 5 6 7  下一页

Tags:ATL 之下 秘密

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