zoukankan      html  css  js  c++  java
  • 多态实现原理

    前提:存在多态性(虚函数)

    版本1

    1、每个类都会维持一份虚表(该表存的是虚函数的入口地址)

    2、每个类产生一个对象时,都会产生一个虚指针,该指针指向对应类的虚表

    3、当基类指针指向派生类对象,调用相关操作时:

      基类指针首先指向派生类对象虚指针(派生类对象虚指针当然是指向派生类对象虚表了),通过该指针遍历虚表,

        若匹配,则执行该操作(即派生类函数),若无(不匹配,相关操作对应的函数为非虚函数,虚表本来就是存放虚函数地址的),

                         则基类指针就指向派生类的普通函数地址直接遍历,执行操作,

                         若还未找到就去基类的普通函数地址中找,执行操作。

    版本2

    1、每个类都会维持一份虚表(该表存的是虚函数的入口地址)

    2、每个类也会维持一个虚指针(我想应该是静态的),该指针指向对应类的虚表

    3、当基类指针指向派生类对象,调用相关操作时:

      基类指针首先指向派生类对象虚指针(派生类对象虚指针当然是指向派生类对象虚表了),通过该指针遍历虚表,

        若匹配,则执行该操作(即派生类函数),则基类指针就指向派生类的普通函数地址直接遍历,执行操作,

                         若还未找到就去基类的普通函数地址中找,执行操作。

    版本3

    1、每个类都会维持一份虚表(该表存的是虚函数的入口地址)

    2、每个类产生一个对象时,都会产生一个虚指针,但是,该指针是动态绑定的,可以指向基类也可以是派生类

    3、当基类指针指向派生类对象,调用相关操作时:

      基类指针指向该虚指针,而该指针首先指向派生类虚表,通过该指针遍历虚表,

        若匹配,则执行该操作(即派生类函数),若无(不匹配,相关操作对应的函数为非虚函数,虚表本来就是存放虚函数地址的),

                         则该指针就指向派生类的普通函数地址直接遍历,执行操作,

                         若还未找到就去基类的普通函数地址中找,执行操作。

    注意:

      1、虚指针是属于类的还是伴随着对象的产生而产生?

      2、sizeof(classname)字节要多4字节(貌似是虚指针),这样虚指针是属于类的,若属于类,则应该是静态的,而静态的是不占类字节大小的,何解?

    我喜欢一无所有,这样就只能一步一步的创造世界...
  • 相关阅读:
    [CSP-S模拟测试]:甜圈(线段树)
    BZOJ4539 [Hnoi2016]树 【倍增 + 主席树】
    Myhchael原创题系列 Mychael vs Kid 【题解】
    BZOJ2668 [cqoi2012]交换棋子 【费用流】
    BZOJ1596 [Usaco2008 Jan]电话网络 【树形dp】
    BZOJ3427 Poi2013 Bytecomputer 【dp】
    BZOJ3526 [Poi2014]Card 【线段树】
    BZOJ3542 DZY Loves March 【map + 线段树】
    BZOJ3832 [Poi2014]Rally 【拓扑序 + 堆】
    HDU 1083
  • 原文地址:https://www.cnblogs.com/riordon/p/3525645.html
Copyright © 2011-2022 走看看