虚函数与虚指针

class A{
public:
  virtual void method1(){
  }
private:
  int a;
  int b;
};

class B: public A{
public:
  virtual void method2(){
  }
private:
  int c;
};

int main()
{
  A* a = new A();
  B* b = new B();
  return 0;
}


打印了a所指向的对象的大小是12,这个很容易理解,就是 A中的a, b 的大小是8字节,然后加上vptr 4字节,所以就是12字节。。

然后打印b所指向的大小是16字节。

虚函数列表肯定是占用内存的,不然在内存中怎么访问。
在对象中,使用一个vptr来指向这个虚函数列表的,也就是说不管基类有多少个virtual函数,
在这个对象中,vptr所占用的空间大小都是4字节(32位机器)。

在继承多个类的时候会有多个vptr..单独继承只有一个..


class a
{
protected:
virtual void test(){cout<<"aaa"<<endl;}
virtual void test1(){cout<<"df"<<endl;}
};

问题1:  
sizeof(a)=4,这个4应该是个指针大小,代表虚指针,但是如果这样的话是不是应该有两个指针呢??  
答:的确是个指针的大小,但是并不是指向虚函数的指针,而是指向虚表的指针,虚表里存放的才是虚函数的指针.

问题2:  
还有一个地方是 a aa; sizeof(aa)=4,那么到底是虚指针是存在类里面还是类的对象里面呢??  

答:类不是一个可以存贮东西的地方,类的概念只存在于编译期间,因为只能存放在对象里。每个同类对象中都有个vptr,指向内存中的vtable,vptr就是4byte。


问题3:  
虚指针是个函数指针,指向虚函数表里面的位置,那么虚函数表是存在哪里的呢??大小又是多少呢?
虚表是整个类共用的,他的大小取决于你定义的虚函数的个数,以及编译器的策略.一般存在于内存的某个地方,你不需要去管他.

转载地址:http://topic.csdn.net/u/20080727/08/e7acb945-0dc6-422a-b7b6-61b23b5182c2.html

           http://topic.csdn.net/u/20110115/18/2c26abe0-9082-4d29-9cb0-b94466cc4457.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值