C++继承(四)对象模型
来源:互联网 发布:nero10刻录软件怎么用 编辑:程序博客网 时间:2024/06/06 09:26
*虚函数表:虚函数表是通过一块连续的内存来存储虚函数的地址
下面是一段程序
class A{public: virtual void fun1() {} virtual void fun2() {}private: int a;};void test(){ A s;}int main(){ test(); system("pause"); return 0;}
虚函数表:
探究单继承对象模型
class A{public: virtual void fun1() { cout << "A::fun1()" << endl; } virtual void fun2() { cout << "A::fun2()" << endl; }private: int a;};class B :public A{public: virtual void fun1() { cout << "B::fun1()" << endl; } virtual void fun3() { cout << "B::fun3()" << endl; } virtual void fun4() { cout << "B::fun4()" << endl; }private: int b;};void test(){ A aa; B bb;}int main(){ test(); system("pause"); return 0;}
上图中子类B::fun1重写了父类A::fun1,覆盖了相应虚表位置上的函数。这里并没有看到子类中的fun3和fun4,实际上这两个函数就存放在fun2的后面,只是 编译器没有显示,这是编译器的一个bug(所采用的编译器为vs2013)
*多继承(菱形继承)的内存布局
#include<iostream>using namespace std;class A{public: virtual void fun1() { cout << "A::fun1()" << endl; } virtual void fun2() { cout << "A::fun2()" << endl; }private: int a;};class B{public: virtual void fun1() { cout << "B::fun1()" << endl; } virtual void fun2() { cout << "B::fun3()" << endl; }private: int b;};class C:public A ,public B{public: virtual void fun1() { cout << "C::fun1()" << endl; } virtual void fun3() { cout << "C::fun3()" << endl; }private: int c;};void test(){ A aa; B bb; C cc;}int main(){ test(); system("pause"); return 0;}
代码分析见下面的图中
0 0
- C++继承(四)对象模型
- 对象(四继承)
- C++-对象继承内存模型配图
- C++对象模型(四)
- C++对象模型(一)单继承
- C++对象模型(二)多继承
- 继承中的对象模型
- 继承中的对象模型
- 继承&对象模型
- Cpp_继承&对象模型
- 【C++】虚函数在不同继承方式中的对象模型
- 面向对象(四)——继承
- C语言也能面向对象(四)——继承
- GIS面向对象模型设计(四)
- 多重继承的对象模型
- C++虚继承对象模型
- C++对象模型-----多继承
- C++对象模型----重复继承
- 关于Vuex,官方文档笔记
- Allegro铺铜详解
- Java垃圾回收机制
- poj3744——Scout YYF I(概率DP+矩阵快速幂)
- 数据库
- C++继承(四)对象模型
- java基础--3.面向对象-6.多态
- 01-Coredump核心转存&&Linux程序地址分析
- POJ 1201 & HDU1384 & ZOJ 1508 Intervals 差分约束
- 复杂json转MAP对象
- Weblogic 12c 集群环境搭建
- java.io.InvalidClassException异常产生原因及解决方案
- BZOJ 3944: Sum
- bzoj2456瞎搞