虚函数列表在程序编译的时候已经存在;
虚指针在new对象时生成,虚指针的大小与虚函数的多少没有关系,所有的虚函数都放在虚函数列表里,通过虚指针来查找!
虚函数列表的地址就是对象的首地址;
typedef void (*FUN)();
如:father *f=new father;
father ff;
假如father有虚函数;
则虚函数列表的地址为:
*(int *)*(int *)f; 或者
*(int *)*(int *)(&ff)
这就是虚函数列表的首地址;
依次取出就是:
FUN a= (FUN)(*((int *)*(int *)f+1);//第二个虚函数的地址;
调用:a();
或者:
FUN b=(FUN)(*((int *)*(int *)(&ff)+2);//第三个虚函数的地址;
调用:b();
虚继承的大小的计算:
例一:
#include <iostream>
#include <memory.h>
#include <assert.h>
using namespace std;
class A //3+虚指针==8,最大字节对齐;
{
char k[3];
public:
virtual void aa(){};
};
class B : public A //k3+j3+虚指针(最大字节对齐)=12;
{
char j[3];
public:
virtual void bb(){};
};
class C : public B //k3+j3+i3+虚指针(最大字节对齐)=16;
{
char i[3];
public:
virtual void cc(){};
};
int main(int arge,char *argv[])
{
cout<<"sizeof(A):"<<sizeof(A)<<endl; //8
cout<<"sizeof(B):"<<sizeof(B)<<endl; //12
cout<<"sizeof(C):"<<sizeof(C)<<endl; //16
system("pause");
return 0;
}
例二:
#include <iostream>
#include <memory.h>
#include <assert.h>
using namespacestd;
class A //3+虚指针==8,最大字节对齐;
{
char k[3];
public:
virtual void aa(){};
};
//虚继承所指向的虚基类的指针和new对象时产生的查找虚函数列表的指针不一样;
class B : public virtual A //k3+j3+虚指针+指向父类的指针(最大字节对齐)=12+4;
{
char j[3];
public:
virtual void aa(){};
};
class C : public virtual B //k3+j3+i3+虚指针+指向A类的虚指针+指向B类的虚指针(最大字节对齐)=16+8;
{
char i[3];
public:
virtual void aa(){};
};
int main(int arge,char *argv[])
{
cout<<"sizeof(A):"<<sizeof(A)<<endl; //8
cout<<"sizeof(B):"<<sizeof(B)<<endl; //16
cout<<"sizeof(C):"<<sizeof(C)<<endl; //24
system("pause");
return 0;
}
例三
#include <iostream>
#include <memory.h>
#include <assert.h>
using namespace std;
class A
{
char k[3];
public:
virtual void aa(){};
};
class B : public virtual A
{
char j[3];
public:
virtual void bb(){};
};
class C : public virtual B
{
char i[3];
public:
virtual void bb(){}; //没有新的虚函数,所以没有自己的虚函数列表;
virtual void aa(){}; //都是重写虚基类的函数;
};
int main(int arge,char *argv[])
{
cout<<"sizeof(A):"<<sizeof(A)<<endl; //8
cout<<"sizeof(B):"<<sizeof(B)<<endl; //20
cout<<"sizeof(C):"<<sizeof(C)<<endl; //28
system("pause");
return 0;
}
有虚继承和虚函数的时候要看自己这个类里有没有新的虚函数有就多一个指向自己的虚函数列表的指针!!!