基类和派生类的虚函数表
来源:互联网 发布:合肥网络诈骗 编辑:程序博客网 时间: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
- 基类和派生类的虚函数表
- 基类和派生类的虚函数表
- 基类和派生类,虚函数
- 虚基类和派生类的函数调用
- 派生类的说明和构造函数
- 基类和派生类的构造函数
- 派生类和基类的函数调用
- c++基类和派生类的构造函数
- C++ 虚函数 派生类的调用
- 派生类的虚函数列表
- 派生类的构造函数和析构函数
- 派生类的构造函数和析构函数
- 关于派生类的构造函数和析构函数
- 派生类的构造函数和析构函数
- 派生类的构造函数和析构函数
- C++派生类的构造函数和析构函数
- C++派生类的构造函数和复制控制函数
- C++ 派生类的构造函数和析构函数
- 获得网络状态和实时监控网络状态改变
- VS2015中搭建lua环境
- 全屏页面往下往上滚动切换页面
- iOS 学习笔记 Quartz2D绘图
- MFC中屏幕刷新闪烁问题解决方法总结
- 基类和派生类的虚函数表
- 理解RemoteViews
- 123
- Linux总结(八):RPM包管理
- 完美解决CodeSmith无法获取MySQL表及列Description说明注释的方案
- 升级iOS10后访问相机、相册、麦克风、通讯录闪退
- 四大组件的工作过程
- shell脚本操作oracle数据库
- 【HEOI2012】bzoj2743 采花