虚继承
虚继承用于解决多继承条件下的菱形继承问题(浪费存储空间、存在二义性)。
底层实现原理与编译器相关,一般通过虚基类指针和虚基类表实现,每个虚继承的子类都有一个虚基类指针(占用一个指针的存储空间,4字节)和虚基类表(不占用类对象的存储空间)(需要强调的是,虚基类依旧会在子类里面存在最多一份拷贝);当虚继承的子类被当做父类继承时,虚基类指针也会被继承。
实际上,vbptr 指的是虚基类表指针(virtual base table pointer),该指针指向了一个虚基类表(virtual table),虚表中记录了虚基类与本类的偏移地址;通过偏移地址,找到虚基类成员,而虚继承也不用像普通多继承那样维持着公共基类(虚基类)的两份同样的拷贝,节省了存储空间。

虚继承、虚函数
•相同之处:都利用了虚指针(均占用类的存储空间)和虚表(均不占用类的存储空间)
•不同之处:

–虚继承
•虚基类依旧存在继承类中,只占用存储空间
•虚基类表存储的是虚基类相对直接继承类的偏移

–虚函数
•虚函数不占用存储空间
•虚函数表存储的是虚函数地址

模板类、成员模板、虚函数

•模板类中可以使用虚函数
•一个类(无论是普通类还是类模板)的成员模板(本身是模板的成员函数)不能是虚函数

抽象类、接口类、聚合类
•抽象类:含有纯虚函数的类
•接口类:仅含有纯虚函数的抽象类
•聚合类:用户可以直接访问其成员,并且具有特殊的初始化语法形式。满足如下特点:
–所有成员都是 public
–未定义任何构造函数
–没有类内初始化
–无基类,也没有 virtual 函数

c++虚继承和虚函数和抽象类、接口类,聚合类相关推荐

  1. C++中的各种“虚“-- 虚函数、纯虚函数、虚继承、虚基类、虚析构、纯虚析构、抽象类讲解

    C++中的各种"虚" 1. 菱形继承 1.1 虚继承 && 虚基类 1.2 虚基类指针(vbptr)&& 虚基类表(vbtable) 2. 多态 2 ...

  2. C++虚继承与虚函数

    虚继承和虚函数是完全无相关的两个概念. 虚继承是解决C++多重继承问题的一种手段,从不同途径继承来的同一基类,会在子类中存在多份拷贝.这将存在两个问题:其一,浪费存储空间:第二,存在二义性问题,通常可 ...

  3. C++虚函数,虚函数表,虚继承,虚继承表

    一.虚函数 类中用virtual关键字修饰的函数. 作用:主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的 ...

  4. 继承、虚继承、虚函数内存分布(MSVC下)

    前提知识: 对象的内存中只包含成员变量,存储在栈区或堆区(使用 new 创建对象): 成员函数与对象内存分离,存储在代码区. 对象的大小,可以自己分析,int 四个字节,指针也是四个字节.(在x86中 ...

  5. C++中的虚继承与虚基类

    1.Cpp中的虚继承与虚基类 在多继承时,很容易产生命名冲突的问题,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生,比如典型的是菱形继承,如下图所示: 类A派 ...

  6. 多重继承、虚继承与虚基类

    一.多重继承 单重继承--一个派生类最多只能有一个基类 多重继承--一个派生类可以有多个基类 class 类名: 继承方式 基类1,继承方式 基类2,-. {-.}; 派生类同时继承多个基类的成员,更 ...

  7. 【C++】继承和派生、虚继承和虚基类、虚基类表和虚基类指针

    继承和派生.虚继承和虚基类.虚基类表和虚基类指针 继承和派生 继承概述 继承基本概念 派生类中的成员 继承的内容 派生类定义 派生类访问控制 对象构造和析构 对象构造和析构的调用顺序 继承中的构造和析 ...

  8. C++_虚继承_虚函数_纯虚函数(多继承的二义性,多态)

    基本信息 每一个类都有一个虚表,以及虚表指针; 虚表的内容是编译器决定的,虚表中用于存放虚函数的指针, 程序运行时的类型信息等; 每个多态对象都存放着一个指向当前类型的虚表的指针, 该指针在构造函数中 ...

  9. C++之菱形继承与虚继承(含虚函数)

    面向对象的三大特征:封装,多态,继承 前面我们已经讲了继承的一些知识点,在这基础上,我们讲的时候再涉猎一些多态的只是. 下面我们先接着上次讲有虚函数的菱形虚继承 首先什么是虚函数.? 虚函数:在类里面 ...

最新文章

  1. hihocoder 1490 Tree Restoration
  2. (0023)iOS 开发之Mac上MySQL服务的卸载
  3. 【Windows部署】首次安装的谷歌Chrome浏览器出现【无法打开此页面】问题处理(详细图文步骤)
  4. boost::container实现从内存资源派生的测试程序
  5. C++类成员属性的一种简洁实现
  6. SinoBBD王帅宇:成为最大的第三方公立大数据平台,关键在于“联动”
  7. H.248-Transcoding与Interception
  8. HMM中的前向法(转)
  9. amd k14主板参数_R5 1400配什么主板好?R5-1400主板搭配与参数详解 (全文)
  10. 电脑坏掉之后,Oracle数据恢复
  11. AI产品经理的前世今生
  12. 推荐一款免费在线高效作图工具
  13. 泛微OA流程中调用SAP接口
  14. shiro中使用自定义filter后,anon不生效解决方案
  15. Excel如何批量为员工信息表添加照片
  16. n条线段可以组成多少种三角形
  17. 10个重要的电子邮件ip黑名单组织以及如何解决删除
  18. Python-Flask开发微电影网站(九)
  19. 一文读懂链上身份(DID):赛道及项目一览
  20. npm installl preinstall

热门文章

  1. 从Java新手到大神需要学哪些知识?
  2. 如何查看linux系统的密码是多少,如何在Linux系统查询SAM密码
  3. python查看dataframe数据类型_python pandas中DataFrame类型数据操作函数的方法
  4. freeswitch 发update sip消息_【PDA】SIP中生物学确认
  5. python socket编程:实现redirect函数、cookie和session
  6. VTK:图像方向用法实战
  7. OpenCASCADE绘制测试线束:拓扑命令之拓扑和曲面创建
  8. boost::thread模块实现默认执行器的测试程序
  9. boost::fusion::traits::tag_of用法的测试程序
  10. ITK:形态分水岭MorphologicalWatershed分割