对象内存布局 (4)

简介: 内容概要: 满足下面2个条件时, 1. 父类有虚函数,子类也有虚函数,且子类的虚函数重写或覆盖了父类的虚函数 2. 非虚继承 类对象之内存布局 在前面的例子中,恢复原来的两个虚函数vfBase_1()和vfBase_2(),同时在Derived类中重写基类的虚函数vfBase_1(),Ba...

内容概要:

满足下面2个条件时,

1. 父类有虚函数,子类也有虚函数,且子类的虚函数重写或覆盖了父类的虚函数

2. 非虚继承

类对象之内存布局

在前面的例子中,恢复原来的两个虚函数vfBase_1()和vfBase_2(),同时在Derived类中重写基类的虚函数vfBase_1(),Base类和Derived类之间的关系如下图:

  

整个代码如下:

#include <iostream>
using namespace std;

class Base
{

public:
    int m_base;
    inline virtual void vfBase_1()
    {
        cout << "This is in Base::vfBase_1()" << endl;
    }

    inline virtual void vfBase_2()
    {
        cout << "This is in Base::vfBase_2()" << endl;
    }
};

class Derived : public Base
{
public:
    int m_derived;
    inline virtual void vfDerived()
    {
      cout << "This is in Derived::vfDerived()" << endl;
    }
    inline void vfBase_1()
    {
        cout << "This is in Derived::vfBase_1()" << endl;
    }
};

typedef void (*VFun)(void);

// 改为template形式,因为不能确定传进来的参数是Base类型的指针还是Derived类型的指针

template<typename T>
VFun virtualFunctionPointer(T* b, int i)
{
    return (VFun)(*((int*)(*(int*)b) + i));
}

int main(void)
{
    Derived d;
    cout << "The size of Base object = \t" << sizeof(Derived) << endl;
    cout << endl;
    int i = 0;
    while(virtualFunctionPointer(&d, i))
    {
        VFun pVF = virtualFunctionPointer(&d, i++);
        pVF();
    }
    return 0;
}

运行结果:

Derived 对象的memory layout图解如下:

 

 

因为Derived类中重写了虚函数vfBase_1(),所以Derived::vfBase_1()就取代了Base::vfBase_1()的位置,位于虚函数表的开始处。而Base::vfBase_1()就不会再在Derived的虚函数表中出现了。

相关文章
|
存储 安全 算法
深入剖析JVM内存管理与对象创建原理
JVM内存管理,JVM运行时区域,直接内存,对象创建原理。
41 2
|
2月前
|
存储 算法 安全
【JVM】深入理解JVM对象内存分配方式
【JVM】深入理解JVM对象内存分配方式
30 0
|
22天前
|
缓存 Java
Java中循环创建String对象的内存管理分析
Java中循环创建String对象的内存管理分析
22 2
|
1天前
为对象分配内存TLAB
为对象分配内存TLAB
|
2天前
|
Java
SpringBoot 项目启动初始化一个Map对象到内存
SpringBoot 项目启动初始化一个Map对象到内存
|
2天前
|
存储 机器学习/深度学习 Java
【Java探索之旅】数组使用 初探JVM内存布局
【Java探索之旅】数组使用 初探JVM内存布局
11 0
|
2月前
|
Python
Python中如何判断两个对象的内存地址是否一致?
Python中如何判断两个对象的内存地址是否一致?
18 0
|
2月前
|
存储 安全 Java
【JVM】Java堆 :深入理解内存中的对象世界
【JVM】Java堆 :深入理解内存中的对象世界
56 0
|
3月前
|
存储 编译器 程序员
近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)
近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)
109 0
|
3月前
|
存储 缓存 算法
深入理解JVM - 对象分配内存
深入理解JVM - 对象分配内存
29 1