ATL布幔之下的秘密
2006-07-22 22:55:08 来源:WEB开发网当虚函数加入到这个派对中的时候,一切就变得都有意思了。请看下面的程序:
程序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
这些程序的输出表明,当你向类中添加了虚函数之后,那么它的尺寸就会增加一个int的大小。在Visual C++中也就是增加4个字节。这就意味着这个类中有三个整数大小的位置,一个是x,一个是y,另一个是处理虚函数之用的虚函数表指针。首先,让我们来看看这个新的位置,也就是这个位于对象首部(或末尾)的虚函数表指针。要这么做的话,我们需要直接存取对象所占用的内存。我们可以使用神奇的指针技术,即用一个指向int的指针来存储一个对象的地址。
Address of Class = 0012FF68
更多精彩
赞助商链接