虚继承和虚函数的相关问题浅析

今天主要要理解的是如下代码在内存中是如何储存/运行的:
class A
{
public:
    virtual void fun1()
    {
        cout << "A::fun1" << endl;
    }
    int _a;
};

class B :virtual public A
{
public:
    virtual void fun1()
    {
        cout << "B::fun1" << endl;
    }

    virtual void fun2()
    {
        cout << "B::fun2" << endl;
    }
    int _b;
};

class C :virtual public A
{
public:
    virtual void fun1()
    {
        cout << "C::fun1" << endl;
    }
    virtual void fun3()
    {
        cout << "C::fun3" << endl;
    }
    int _c;
};

class D : public B, public C
{
public:
    virtual void fun1()
    {
        cout << "D::fun1" << endl;
    }
    virtual void fun4()
    {
        cout << "D::fun4" << endl;
    }
    int _d;
};

int main()
{
    D s;
    s._a = 'a';     

    s._b = 'b';
    s._c = 'c';
    s._d = 'd';
    return 0;
}
运行后函数中s的那块内存储存的内容如下图所示:

这里写图片描述

那么我们可以轻易地从中看出a,b,c,d各个变量的储存位置,那么问题来了为什么b,c,d都是按顺序储存的,可是a却储存在了最末尾,而且b,c上方都还有一块储存空间存一些好像是地址的东西这又是什么呢?
我们先进入00d2dd38地址看一下其中存储的内容如下图:

这里写图片描述

观察这两幅图不难发现0x18,和0xfffffffc是偏移量,分别指向两个地址0x010FFD90和0x010FFD70两个地址,其中储存的变分别是变量a的值和变量b上方的另一个指针。
再打开另一个指针所在的空间0x00D2DD14,结果如下图:

这里写图片描述

这中间还依旧是一串形似地址的东西,同理再去打开另外一个变量的空间,其中储存的内容如下:

这里写图片描述

又是一个地址。
通过查询资料可以了解到,继承后子类内部的储存空间会将父类各个分开储存,如下图:

这里写图片描述

其中两个地址又分别为虚表和虚基表,总结如下:这里写图片描述

各位再见!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值