基类和派生类的虚函数表

来源:互联网 发布:合肥网络诈骗 编辑:程序博客网 时间:2024/05/21 14:43

转载于http://blog.csdn.net/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
派生类虽然重新实现虚函数,但是派生类有自己的虚函数表,但是虚函数表中,虚函数的地址和基类中虚函数的地址一样。 

 
0 0
原创粉丝点击