class base
{
public:
base(){};
  ~base(){};
  virtual void f(int){};
  void g2(){};
};class ba
{
public:};void main()
{
cout<<sizeof(base)<<endl;//输出为4,这个4是由什么量占去的,为什么?
cout<<sizeof(ba)<<endl;//输出为1,同由什么占去的,为什么?
}

解决方案 »

  1.   

    1. vptr, 类中隐藏了一个指针,该指针指向虚函数表
    2. 占位,The sizeof operator never yields 0, even for an empty class. 
      

  2.   

    1. 32位下,vptr是4个字节
    2. 按照Bjarne的说法,对于无数据成员和无虚函数的类,sizeof操作将返回1个字节,这是为了保证能建立类的实例以及参数传递的正确
      

  3.   

    一楼已经说得差不多了class ba {
    };这样的类大小不会是0,具体多大,与编译器的实现有关。
    类大小不为0,是有明确意义的,如:
    ba test[10]; // 尽管ba里面是空的,但ba大小不能为零,否则ba的数组无意义
    ba *p = new ba; // 此时ba大小也不能为零,否则会分配0大小的对象
    class base
    {
    public:
    base(){};
      ~base(){};
      virtual void f(int){};
    };这个类的大小为sizeof(void*),原因是包含虚函数指针。vptr与实现相关的。在VC里面,vptr位与类内存位置的最开始,所以它与this是相等的,但某些实现里面,vptr可能位于类的内存位置尾部,就与this不相等了。