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

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的构造

汇编

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

虚继承

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

时间: 2024-08-30 10:06:11

汇编角度解释一下继承与多态的相关文章

Java 继承、多态与类的复用

摘要: 本文结合Java的类的复用对面向对象两大特征继承和多态进行了全面的介绍. 首先,我们介绍了继承的实质和意义,并探讨了继承,组合和代理在类的复用方面的异同.紧接着,我们依据继承引入了多态.介绍了它的实现机制和详细应用.此外,为了更好地理解继承和多态.我们对final关键字进行了全面的介绍. 在此基础上.我们介绍了Java中类的载入及初始化顺序.最后.我们对面向对象设计中三个十分重要的概念–重载.覆盖与隐藏进行了详细的说明. 要点: 继承 组合,继承,代理 多态 final 关键字 类载入及

【转】C#三大特性之 封装、继承、多态

C#三大特性之 封装.继承.多态 一.封装: 封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类).被封装的对象通常被称为抽象数据类型.  封装的意义: 封装的意义在于保护或者防止代码(数据)被我们无意中破坏.在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改. 封装提供了一个有效的途径来保护数据不被意外的破坏.相比我们将数据(用域来实现)在程序中定义为公用的(public)我们将它们(fie

java继承和多态

java方法直接调用原理推测 有错误还望指正 当直接调用某对象的某方法时  会更具该对象获取到类信息对象   在从类信息对象中找到该方法 没找到 获取父类信息对象继续查找 找到了执行  jdk距离实现是通过反射还是其它? 如果按以上原理    以下情况解释不通 创建一子类对象  赋值给一父类指针变量  通过父类指针变量掉run方法   run方法在父类或子类中为私有  这种情况调用的是父类的run方法 并非子类的run方法 反射jar包 package extend; import org.ju

关于java的this、继承、多态的理解

今天主要学习的内容是关于this.继承.多态的理解,并对其作出总结. 1.This 就目前来说,从个人的实验来看,this主要是对于一个类的对象的引用.它出现的位置主要是以它出现的形式决定的. ①.this(参数类型)这是在在构造方法中调用重写的构造方法. ②.作为某个类的对象来调用类中属性或方法.(用在某个类中的成员方法,因为某个类的对象就可以通过.来调用) 2.extends 继承之前已经了解了一些,接下来就是进一步的总结. ①.protected类型的变量是适合子类和父类之间的使用的,即使

类和对象、封装、继承、多态

? 类和对象 ? 类和对象的概念 类:客观存在的,抽象的,概念的东西.一个类可以被定义为描述行为的模板: 对象:对象是具体的,实际的,代表一个事物.对象具有状态和行为. 类是对象的模板,对象是类的一个具体实体. 定义Java中的类 一个类可以包含以下任意变量类型. a)局部变量: 方法里面,构造函数或块中定义的变量称为局部变量.该变量将被声明和初始化的方法中,当该方法完成该变量将被销毁. b)实例变量: 实例变量都在一个类,但任何方法之外的变量.这些变量在类被加载的实例化.实例变量可以从内部的任

[转]Java中继承、多态、重载和重写介绍

什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承.多态.重载和重写. 继承(inheritance) 简单的说,继承就是在一个现有类型的基础上,通过增加新的方法或者重定义已有方法(下面会讲到,这种方式叫重写)的方式,产生一个新的类型.继承是面向对象的三个基本特征--封装.继承.多态的其中之一,我们在使用JAVA时编写的每一个类都是在继承,因为在JAVA语言中,java.lang.Object类是所有类最根本的基类(或者叫父类.超类),如果

论“继承与多态”的重要性

面向对象语言三大特征:封装.继承.多态. 封装:一个类留给外部接口总是小于内部实现的方法. 继承:自雷可以继承父类的字段.属性.方法. 多态:面对同一消息,不同类的对象做出不同的响应. 一.认识继承 (1)生活角度 父类:动物    英雄        人 子类:狗      抗日英雄    中国人 父类          超类        基类 子类          子类        派生类 [继承]也称派生.继承指的是子类继承父类的字段.属性.方法.派生是指子类在父类基础上可以添加自己

C#中面向对象——封装,继承,多态

摘要:提到面向对象就不得不说面向对象的三大特性,封装:继承:多态!下面还是通过图和例子的方式继续了解一下面向对象的三个核心! 下面还是通过具体的图进行分析: 通过代码来感受一下语法: class Program { static void Main(string[] args) { Fu f1 = new Fu(); f1.GetFu(); //父类就只能获取到父类的属性方法,是不能获取到子类的方法的 zi z1 = new zi(); z1.GetZi(); //子类既可以获取到子类的方法属性

从汇编角度来理解linux下多层函数调用堆栈执行状态

注:在linux下开发经常使用的辅助小工具: readelf .hexdump.od.objdump.nm.telnet.nc 等,详细能够man一下. 我们用以下的C代码来研究函数调用的过程. C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int bar(int c, int d) { int e = c + d; return e; } int foo(int a, int b) { return bar(a, b); } int main(