#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