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