我们都知道c++中的虚函数说靠在继承体系中,用虚函数重写来实现它的多态的,那么具体是怎么实现的呢?
我们看看以下的代码
class a
{
public:
virtual void c
{
cout<<"a";
}
int _a;
};
class b :public a
{
public:
virtual void c
{
cout<<"a";
}
int _b;
};
int main()
{
a A;
b B;
cout<<"A的大小为"<<sizeof(A);
cout<<"B的大小为"<<sizeof(B);
}
看到这个代码时,我们脑海中第一印象就是a的大小是4字节,b的大小时8字节。
但是如果运行这个代码得到的结果却是8个字节和12个字节,这是怎么回事呢。
原来在a类和b类创建对象时,会多创建四个字节的变量,根据内存的查找以及监视功能,我们得知,第一个被创建出来的四个字节的变量为一个指针,指向虚函数的内存地址。这就是虚表,这个内存地址不单单储存一个虚函数,根据虚函数的数量,它会沿着前面的虚函数往下排序。
那么这个虚表有什么作用呢,或者说虚表跟多态有什么关系呢。
原来在实现拥有虚函数的类的对象时,都会创建一个虚表和指针,虚表用来存储虚函数的地址,根据对象的类的不同和调用的虚函数不同,来实现多态。值得注意的是,无论是基类的实例化还是子类的实例化,都会重现创建一个虚表,而不是共用一个虚表,
若子类的虚函数没有被重写,则子类的虚表中拷贝一份基类的虚表使用。而不是和基类公用一个虚表