转载于http://blog.youkuaiyun.com/kangroger/article/details/38313461
在派生类中,其虚函数表和基类的虚函数表有什相关性吗?做个试验看一下:
1、派生类重新实现虚函数。查看其虚函数表和虚函数表中虚函数的地址
#include<iostream>
using namespace std;
class Base{
public:
virtual void fun()
{
cout<<"This is Base Class"<<endl;
}
};
class Derived:public Base{
public:
void fun()
{
cout<<"This is Derived Class"<<endl;
}
};
int main()
{
Base B;
Derived D;
int **p=(int**)&B;
cout<<"基类的虚函数表地址:"<<p[0]<<endl;
cout<<"基类的虚函数表中虚函数的地址:0x"<<hex<<p[0][0]<<endl;
p=(int**)&D;
cout<<"派生类的虚函数表地址:"<<p[0]<<endl;
cout<<"派生类的虚函数表中虚函数的地址:0x"<<hex<<p[0][0]<<endl;
return 0;
}
输出结果:
基类的虚函数表地址:0x445060
基类的虚函数表中虚函数的地址:0x415390
派生类的虚函数表地址:0x445070
派生类的虚函数表中虚函数的地址:0x4153dc
可以看出,基类和派生类的虚函数表不同,虚函数的地址也不同。这个结果符合预期,因为派生类中重新实现了虚函数,基类肯定
有自己的虚函数表,虚函数的地址自然是重新实现的那个。
2、派生类不重新实现虚函数。查看其虚函数表和虚函数表中虚函数的地址
#include<iostream>
using namespace std;
class Base{
public:
virtual void fun()
{
cout<<"This is Base Class"<<endl;
}
};
class Derived:public Base{
};
int main()
{
Base B;
Derived D;
int **p=(int**)&B;
cout<<"基类的虚函数表地址:"<<p[0]<<endl;
cout<<"基类的虚函数表中虚函数的地址:0x"<<hex<<p[0][0]<<endl;
p=(int**)&D;
cout<<"派生类的虚函数表地址:"<<p[0]<<endl;
cout<<"派生类的虚函数表中虚函数的地址:0x"<<hex<<p[0][0]<<endl;
return 0;
}
输出结果:
基类的虚函数表地址:0x445050
基类的虚函数表中虚函数的地址:0x415390
派生类的虚函数表地址:0x445060
派生类的虚函数表中虚函数的地址:0x415390
派生类虽然重新实现虚函数,但是派生类有自己的虚函数表,但是虚函数表中, 虚函数的地址和基类中虚函数的地址一样。