zoukankan      html  css  js  c++  java
  • 对象内存布局 (3)

    内容概要:

    满足下面2个条件时,

    1. 父类无虚函数,子类有虚函数

    2. 非虚继承

    类对象之内存布局

    如果将Base中的两个虚函数删除,情况有会怎么样呢?

    将Base中的两个虚函数删除,其他保持不变。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;
        }
    };
    
    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 = 	" << sizeof(Derived) << endl;
        cout << endl;
        int i = 0;
        while(virtualFunctionPointer(&d, i))
        {
            VFun pVF = virtualFunctionPointer(&d, i++);
            pVF();
        }
        return 0;
    }

    运行结果如下:

    Derived对象的memory layout图解如下:

     

    这次由于Base类中不存在虚函数,所以在Derived类对象中的Base subobject就不会有vptr了,但Derived类中有虚函数,所以它的对象中就有vptr了。

  • 相关阅读:
    HDU1879 kruscal 继续畅通工程
    poj1094 拓扑 Sorting It All Out
    (转)搞ACM的你伤不起
    (转)女生应该找一个玩ACM的男生
    poj3259 bellman——ford Wormholes解绝负权问题
    poj2253 最短路 floyd Frogger
    Leetcode 42. Trapping Rain Water
    Leetcode 41. First Missing Positive
    Leetcode 4. Median of Two Sorted Arrays(二分)
    Codeforces:Good Bye 2018(题解)
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4090823.html
Copyright © 2011-2022 走看看