码迷,mamicode.com
首页 > 其他好文 > 详细

汇编角度解释一下继承与多态

时间:2018-03-30 13:19:04      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:climits   为什么   返回值   http   图片   内存   没有   构造函数   tab   

1 代码

#include <map>
#include <iostream>
#include <string>
#include <vector>
#include <climits>
#include <algorithm>
#include <math.h>
#include <utility>
using namespace std;

class A
{

  public:
    A()
        : a1(2)
    {
        int i = 0;
        ++i;
    }
    virtual int do1() { return 1; }
    virtual int do2() { return 2; }
    int a1;
};

class B : public A
{
  public:
    B()
        : b1(2)
    {
        int i = 0;
        ++i;
    }

    virtual int do1() { return 3; }
    int b1;
    int b2;
};

class C : public virtual A
{
  public:
    C()
        : c1(2)
    {
        int i = 0;
        ++i;
    }
    virtual int do1() { return 4; }
    int c1;
};

int main()
{
    A *a = new A;
    B *b = new B;
    C *c = new C;

    A *ab = b;
    b->do1();
    A *ac = c;
}

 

 

构造函数体中的代码没有意义只是为了解释代码执行的顺序。

 首先看:

技术分享图片

汇编:

技术分享图片

上面最后一个注释错了,rbx是申请的内存,构造函数没有返回值,因此rbx直接赋值给指针a了。

然后看A:A()

技术分享图片

(至于为什么是:OFFSET FLAT:vtable for B+16 。抱歉不知道啊。查到的时候再补

 紧接着看看 vtable for A  是什么:

技术分享图片

然后再看:

技术分享图片

 

这里A就算构造结束,还算是简单。

看B的构造

技术分享图片

汇编

技术分享图片

 

可以非虚继承就是在派生类的内存空间上依次调用基类的构造函数。基类的数据成员在派生类中依次摆放。并且派生类的数据成员的偏移在编译阶段就确定好了。

 

虚继承

汇编角度解释一下继承与多态

标签:climits   为什么   返回值   http   图片   内存   没有   构造函数   tab   

原文地址:https://www.cnblogs.com/perfy576/p/8675555.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!