用一个指向int的指针来存储一个对象的地址。

#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;
 return 0;
}

Size of Class = 4

#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;
 return 0;
}

Size of Class = 4

#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;
 return 0;
}

Size of Class = 12

这些程序的输出表明,当你向类中添加了虚函数之后,那么它的尺寸就会增加一个int的大小。 在Visual C++中也就是增加4个字节。这就意味着这个类中有三个整数大小的位置, 一个是x,一个是y,另一个是处理虚函数用的虚函数表指针

#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的值

X = 100
Y = 200

原文地址:https://www.cnblogs.com/byfei/p/3112229.html