单继承
2016-04-18 14:08
197 查看
1.源代码
运行的结果 :
看看取d地址的内存
得出单继承 ,无虚函数 的模型
运行结果:
看看取d地址的内存
地址 (0x 01 33 cd 44 )是虚表的地址 ,虚表下存的是类Base 和 类 Der 的虚函数
从这些结果可以,得出 单继承 ,有虚函数但不覆盖 的模型
虚表中函数的变化: 复制父类的虚表 ;添加子类的虚函数
运行结果:
看看取d地址的内存
从这些结果可以,得出 单继承 ,有虚函数有覆盖的模型
</pre><pre name="code" class="cpp">// 1.单继承 ,无虚函数 #include <iostream> using namespace std; class Base { public: Base() :m_data1(0x01) { } void FunTest1() { } private: int m_data1; }; class Der : public Base { public: Der() :m_data2(0x02) { } void FunTest2() { } void FunTest3() { } private: int m_data2; }; int main() { Der d; cout << "d size :"<<sizeof(d) << endl; return 0; }
运行的结果 :
看看取d地址的内存
得出单继承 ,无虚函数 的模型
<pre name="code" class="cpp">// 2.单继承 ,有虚函数但不覆盖 #include <iostream> using namespace std; class Base { public: Base() :m_data1(0x01) { } virtual void FunTest1() { cout << "Base::FunTest1()" << endl; } private: int m_data1; }; class Der : public Base { public: Der() :m_data2(0x02) { } virtual void FunTest2() { cout << "Der::FunTest2()" << endl; } virtual void FunTest3() { cout << "Der::FunTest3()" << endl; } private: int m_data2; }; typedef void(*vftab)(); void Test() { Der d;
<span style="white-space:pre"> </span>cout << "Der size:" << sizeof(d)<<endl; cout << "-------Der---- " << endl; int *vfpt = (int *)(*(int *)&d); vftab vft = (vftab)(*(int *)vfpt); while (vft != 0) { vft(); vfpt++; vft = (vftab)(*vfpt); } cout << endl; } int main() { Test(); return 0; }
运行结果:
看看取d地址的内存
地址 (0x 01 33 cd 44 )是虚表的地址 ,虚表下存的是类Base 和 类 Der 的虚函数
从这些结果可以,得出 单继承 ,有虚函数但不覆盖 的模型
虚表中函数的变化: 复制父类的虚表 ;添加子类的虚函数
// 3.单继承 ,有虚函数有覆盖 #include <iostream> using namespace std; class Base { public: Base() :m_data1(0x01) { } virtual void FunTest1() { cout << "Base::FunTest1()" << endl; } private: int m_data1; }; class Der : public Base { public: Der() :m_data2(0x02) { } virtual void FunTest1() { cout << "Der::FunTest1()" << endl; } virtual void FunTest2() { cout << "Der::FunTest2()" << endl; } virtual void FunTest3() { cout << "Der::FunTest3()" << endl; } private: int m_data2; }; typedef void(*vftab)(); void Test() { Der d; cout << "Der size:" << sizeof(d) << endl; cout << "-------Der---- " << endl; int *vfpt = (int *)(*(int *)&d); vftab vft = (vftab)(*(int *)vfpt); while (vft != 0) { vft(); vfpt++; vft = (vftab)(*vfpt); } cout << endl; } int main() { Test(); return 0; }
运行结果:
看看取d地址的内存
从这些结果可以,得出 单继承 ,有虚函数有覆盖的模型
相关文章推荐
- spring aop事务传播方式和隔离级别
- java中类加载机制
- java实现图片与base64字符串之间的转换
- DatabaseImageViewer 数据库二进制数据查看器
- 【数据库】4种视图的特点及应用场景
- 总结Web应用中常用的各种Cache
- 欧几里德与拓展欧几里德算法
- util文件的作用
- CSS hack
- json转换为datatable
- 昨天刚看了Handler和HandlerThread这个东西,不明白为什么要用这么复杂的东西,而且Handler直接post的话好像还不是子线程运行。那我再开发的时候直接用Thread行不行?两个有什么区别?
- Sqlserver日期操作
- Java NIO使用及原理分析 (一)(转)
- 深度学习方法:受限玻尔兹曼机RBM(二)网络模型
- 设计模式学习--(1)
- 线程示例:多线程卖票
- 消除svn选定(checkout)桌面上显示一大堆问号
- EditText弹出软键盘,空白处隐藏
- 解决Android中No resource found that matches android:TextAppearance.Material.Widget.Button.Inverse问题
- 树的前中后非递归遍历