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

ATL布幔之下的秘密

 2006-07-22 22:55:08 来源:WEB开发网   
核心提示: 程序8. #include <iostream>using namespace std;class CPoint {public:int m_ix;int m_iy;CPoint(const int p_ix = 0, const int p_iy = 0) :m_ix(p_i

程序8. #include <iostream>
using namespace std;
class CPoint {
public:
 int m_ix;
 int m_iy;
 CPoint(const int p_ix = 0, const int p_iy = 0) :
  m_ix(p_ix), m_iy(p_iy) {
 }
 int getX() const {
  return m_ix;
 }
 int getY() const {
  return m_iy;
 }
 virtual ~CPoint() { }
};
int main() {
 CPoint objPoint(5, 10);
 int* pInt = (int*)&objPoint;
 *(pInt+1) = 100; // 企图改变x的值
 *(pInt+2) = 200; // 企图改变y的值
 cout << "X = " << objPoint.getX() << endl;
 cout << "Y = " << objPoint.getY() << endl;
 return 0;
}
并且,程序的输出为:X = 100
Y = 200
下图清楚地示范了当我们向类中添加了虚函数之后,虚函数表指针就会被添加在内存结构中的第一个位置。

现在问题出现了:虚函数表指针中到底存储了什么?那么看看下面的程序:

程序9. #include <iostream>
using namespace std;
class Class {
 virtual void fun() { cout << "Class::fun" << endl; }
};
int main() {
 Class objClass;
 cout << "Address of virtual pointer " << (int*)(&objClass+0) << endl;
 cout << "Value at virtual pointer " << (int*)*(int*)(&objClass+0) << endl;
 return 0;
}
程序的输出为:Address of virtual pointer 0012FF7C
Value at virtual pointer 0046C060
虚函表数指针存储了一个虚函数表的地址。并且,虚函数表存储了类中所有虚函数的地址。换句话说,虚函数表是一个数组,这个数组的元素为虚函数指针的地址。让我们看看下面这个程序来考虑吧。

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

Tags:ATL 之下 秘密

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