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

ATL布幔之下的秘密

 2006-07-22 22:55:08 来源:WEB开发网   
核心提示: 程序7. #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

程序7. #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+0) = 100; // 企图改变x的值
 *(pInt+1) = 200; // 企图改变y的值
 cout << "X = " << objPoint.getX() << endl;
 cout << "Y = " << objPoint.getY() << endl;
 return 0;
}
这个程序中最重要的东西是:int* pInt = (int*)&objPoint;
 *(pInt+0) = 100; // 企图改变x的值
 *(pInt+1) = 200; // 企图改变y的值
其中,我们在把对象的地址存入一个整型指针之后,就可以把这个对象看作一个整型的指针了。程序的输出为: X = 200
Y = 10
当然,这并不是我们想要的结果,它表明200存储在了m_ix数据成员的位置。这就意味着m_ix,也就是第一个成员变量,是起始于内存中第二个位置的,而不是第一个。换句话说,第一个成员是虚函数表指针,其它的才是对象的数据成员。那么,只需要修改以下的两行: int* pInt = (int*)&objPoint;
*(pInt+1) = 100; // 企图改变x的值
*(pInt+2) = 200; // 企图改变y的值
这样我们就会获得想要的结果了,以下为完整程序:

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

Tags:ATL 之下 秘密

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