在c中,对于不包含虚函数的类,其大小是变量的大小,是不包含在类中的非虚函数。
case 1:类包含变量class base1{ public : int base1_ 1; int base1_2; //void foo () }; 例如对Base1来说,foo )函数的有无、sizeof ) Base1)的大小都是8,表示类自身的函数不计入类的大小,其实也是合理的。 例如,即使定义了10个Base1,这10个Base1也可以通过使用相同的方法大大节省类占用的内存。
case 2:指向类的函数指针class base2{ public : int base1_ 1; int base1_2; void(*foo ) ); (; 对Base1来说,他的大小为16,是一个比Base1多8字节的函数指针。
case 3(类中有一个或多个虚函数classbase3) public:intbase1_1; int base1_2; virtualvoidbase1_ fun1({ }/virtualvoidbase1_ fun2) {}/…}; 在Base3中,他的大小为16,表示虚函数占用内存。
但是添加了很多虚函数,发现内存大小仍然是16。 在查阅资料时,我们发现类中的虚函数由一个称为虚指针的东西管理。 也就是说
指针(__vptr )记录用于存储此类中所有虚函数的存储器地址。
将容纳所有这种虚函数的这个存储器称为虚函数表。 访问虚函数表的各虚函数通过__vptr[0]、__vptr[1]、
对于Base3,在内存中可能是这样。
将virtual void base1_fun2添加到Base3时,在内存中情况如下。
case 4 :或更高版本的类共享一个虚函数表,每个类都有自己的虚指针。 # include ' stdio.h ' class base1{ public : int base1_ 1; int base1_2; virtualvoidbase1_ fun1{ } virtualvoidbase1_ fun2{ }; int main () { Base1 b1; Base1 b2; }
在上面的示例中声明,可以看到(1) b1和b2有自己的虚拟指针;2 )在一个程序中,一个类只有一个虚拟函数表。