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_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
当然,这并不是我们想要的结果,它表明200存储在了m_ix数据成员的位置。这就意味着m_ix,也就是第一个成员变量,是起始于内存中第二个位置的,而不是第一个。换句话说,第一个成员是虚函数表指针,其它的才是对象的数据成员。那么,只需要修改以下的两行:
Y = 10int* pInt = (int*)&objPoint;
这样我们就会获得想要的结果了,以下为完整程序:
*(pInt+1) = 100; // 企图改变x的值
*(pInt+2) = 200; // 企图改变y的值
更多精彩
赞助商链接