剖析C++对象模型
来源:互联网 发布:如何删除知乎提问 编辑:程序博客网 时间:2024/05/22 04:33
多态:就是指多种形态
C++中虚函数的主要作用就是实现多态, 简单说父类的指针/引用调用重写的虚函数,当父类指针/引用指向父类对象调用的是父类的虚函数,指向子类对象时调用的是子类的虚函数。
<span style="font-size:24px;"><span style="font-size:24px;">#include<iostream>using namespace std;class Base{public:<span style="white-space:pre"></span>virtual void func1()<span style="white-space:pre"></span>{<span style="white-space:pre"></span>cout << "Base::func1" << endl;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>virtual void func2()<span style="white-space:pre"></span>{<span style="white-space:pre"></span>cout << "Base::func2" << endl;<span style="white-space:pre"></span>}private:<span style="white-space:pre"></span>int a;};class Derive :public Base{public:<span style="white-space:pre"></span>virtual void func1()<span style="white-space:pre"></span>{<span style="white-space:pre"></span>cout << "Derive::func1" << endl;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>virtual void func3()<span style="white-space:pre"></span>{<span style="white-space:pre"></span>cout << "Derive::func3" << endl;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>virtual void func4()<span style="white-space:pre"></span>{<span style="white-space:pre"></span>cout << "Derive::func4" << endl;<span style="white-space:pre"></span>}private:<span style="white-space:pre"></span>int b;};int main(){Base b;Deverse d;system("pause");return 0;}</span></span>
Base模型分析:
Base实例化的对象b, 通过监视窗口我们可以看到,b中不仅有成员变量_a ,还有__vfptr,它就是虚表指针,虚表指针中下标为0的指向Base::fun1() ,下标为1的指向Base::fun2()
Derive模型分析:
Derive实例化对象d,他继承了Base类,所以可以看到不仅有数据_a还有数据_b,但是在虚函数指针中只显示了两个,按照继承规则,在d中应该有重写了Base的
Derive::fun1, 来自基类的Base::fun2 ,还有Derive::fun3, Derive::fun4
但是没有显示出来,这应该是vs的一个bug;
不过我们可以通过以下方式将他们打印出来:
<span style="font-size:24px;">typedef void (* FUNC) ();void PrintVTable (int* VTable){ cout<<" 虚表地址>"<< VTable<<endl ; for (int i = 0; VTable[i ] != 0; ++i) { printf(" 第%d个虚函数地址 :0X%x,->", i , VTable[i ]); FUNC f = (FUNC) VTable[i ]; f(); } cout<<endl ;}</span>
1 0
- 剖析C++对象模型
- 深度剖析C++模型对象
- C++虚函数对象模型剖析
- Objective-C对象模型
- Objective-C对象模型
- objective C 对象模型
- C ++ 对象模型
- Objective-C 对象模型
- 【C++】对象模型
- Objective-C对象模型
- C/C++的对象模型
- Objective-C的对象模型
- 图解Objectvie-C对象模型
- C/C++的对象模型
- C++对象模型(剖析虚函数表)
- thinkphp5剖析 模型查询对象类型转数组
- Objective-C对象模型--类对象和元类对象
- 深度探索C++对象模型
- Yoshua Bengio为什么能跟Hinton、LeCun相提并论?
- python 装饰器
- C语言练习题每练 1:字符串统计单词个数,单词由空格隔开
- 30 年后你拿什么养活自己(1):培养理财意识的一本书
- 字符串(String)
- 剖析C++对象模型
- 读取电话联系人
- Android的activity启动延迟加载
- 悬浮框效果
- DirectXMath
- File的sd卡
- 数据库三范式讲解
- NFS安装
- Picasso详细解析(一)