zoukankan      html  css  js  c++  java
  • C++ 浅谈virtual

    virtual有两种用途

    1,虚函数

    2,虚继承

    虚函数

    虚函数出来的主要目的是实现多态,虚函数的组成有 “虚函数指针”  “虚函数表”

    编译器在编译的过程中,如果检测到类里面有virtual修饰的函数,那么就会生成一个虚函数表,然后实例化对象的时候生成一个虚函数指针,对象可以通过虚函数指针来对虚函数表进行操作,虚函数指针位于对象的首地址,然后虚函数指针指向的又是虚函数表的首地址,虚函数表包含了所有的虚函数

    多态:首先要知道的是,子类继承父类,是将父类对应的内存+自己的,然后上行转换的时候,就是将子类对应父类的内存给父类,多态->基类定义虚函数,子类进行重写,重写过后,子类对应的的虚函数表进行了重写成为了新的,然后上行转换,父类得到子类中继承自父类的虚函数表,因为虚函数表的对应函数已经被修改,给过去之后,父类实质上调用的是子类的函数

    对象如果有虚函数指针的话要占内存4字节

    虚继承

    虚继承出现的目的是为了解决菱形继承,菱形继承也就是基类A    子类B,C分别继承A     D多继承B,C,然后就会产生两个问题,基类A中的成员进行了两次拷贝,浪费内存。还有就是调用基类A中的成员时,要引用类名::成员,说明调用的时来自哪个类的,不然会编译错误,编译器无法识别成员是来自B,C哪个类,这样就出现了二义性

    虚继承的话也就是在 B,C继承的时候前面加上virtual关键字,那么对象就会有一个虚基类指针,对应类也有一个虚基类表,虚基类表中存储的是当前类与父类的偏移量,利用偏移量来调用父类的成员,这样多个派生类虚继承于基类,但是实际上都是利用偏移量来调用的,然后D就会继承来自BC的虚基类指针,并且利用虚基类指针来调用A类成员,实现了一份内存的调用不需要两份拷贝

  • 相关阅读:
    P1662 数7
    P3645 [APIO2015]雅加达的摩天楼
    P3396 哈希冲突
    P7479 至曾是英雄的您
    P7480 Reboot from Blue
    Apache Commons Collections
    ESP8266 WIFI杀手
    ESP8266 固件升级
    ESP8266 MicroPython安装与使用
    Window 安装子系统
  • 原文地址:https://www.cnblogs.com/Lis-/p/12504516.html
Copyright © 2011-2022 走看看