几种不同的C++继承方式
来源:互联网 发布:java的两年职业规划 编辑:程序博客网 时间:2024/05/22 05:13
前言:欢迎转载,但请注明出处http://blog.csdn.net/jiadabin,因为原文可能会改动部分不足,最好从原文处阅读,同时也欢迎大家来点评丶吐槽!让我们大家共同进步......
C++编程语言功能强大,可以对多种程序设计风格提高支持。其中就包括面向对象的各种特性。我们在这里先为大家讲解一下C++继承的一些基本概念。C++继承方式分为两种,普通继承和虚拟继承(virtual)。具体的继承又根据父类中的函数是否virtual而不同。
下面就单继承分为几种情况阐述:
C++继承方式1.普通继承+父类无virtual函数
若子类没有新定义virtual函数 此时子类的布局是 : 由低地址->高地址 为父类的元素(没有vptr),子类的元素(没有vptr).
若子类有新定义virtual函数 此时子类的布局是 : 由低地址->高地址 为父类的元素(没有vptr),子类的元素(包含vptr,指向vtable.)
C++继承方式2. 普通继承+父类有virtual函数
不管子类没有新定义virtual函数 此时子类的布局是 : 由低地址->高地址 为父类的元素(包含vptr), 子类的元素.
如果子类有新定义的virtual函数,那么在父类的vptr(也就是第一个vptr)对应的vtable中添加一个函数指针.
C++继承方式3.virtual继承
若子类没有新定义virtual函数 此时子类的布局是 : 由低地址->高地址 子类的元素(有vptr),虚基类的元素.为什么这里会出现vptr,因为虚基类派生出来的类中,虚类的对象不在固定位置(猜测应该是在内存的尾部),需 要一个中介才能访问虚类的对象.所以虽然没有virtual函数,子类也需要有一个vptr,对应的vtable中需要有一项指向 虚基类.
若子类有新定义virtual函数 此时子类的布局是与没有定义新virtual函数内存布局一致.但是在vtable中会多出新增的虚函数的指针.
C++继承方式4.多重继承
此时子类的布局是 : 由低地址->高地址 为父类p1的元素(p1按照实际情况确定元素中是否包含vptr), 父类p2的元素(p2按照实际情况确定元素中是否包含vptr),子类的元素.
如果所有父类都没有vptr,那么如果子类定义了新的virtual function,那么子类的元素中会有vptr,对应的vtable会有相应的函数指针.
如果有的父类存在vptr,我感觉如果子类定义的新的virtual function,会加在第一个有vptr的父类的vtable中.因为子类分配的空间显示并没有新增加一个4字节的指针空间.
- 几种不同的C++继承方式
- 几种继承的方式
- 几种不同的NAT方式
- 几种不同的FTP下载方式
- 几种不同的log4j创建方式
- js的几种继承方式
- javascript 对象继承的几种方式
- JavaScript继承的几种方式解析
- javascript 继承的几种方式
- 几种js的继承方式
- JavaScript继承的几种方式
- js的几种继承方式
- js的几种继承方式
- js实现继承的几种方式
- javascript 实现继承的几种方式
- javascript的几种继承方式
- JavaScript的几种继承方式
- javascript继承的几种方式
- Codeforces Round #288 (Div. 2)---C. Anya and Ghosts
- mysql监控和性能分析工具
- R语言基本统计分析方法(包和函数)
- Gson 专题详解 之一 简单的对象转化json和json转成对象
- 开始为我的第一次CSDN Blog
- 几种不同的C++继承方式
- mac 强制关闭程序
- 思维导图
- QT中关于Tab顺序
- R语言统计分析篇
- 仿豌豆荚ViewPager下拉
- 获取一个标签文字的长度和显示完整文字
- hadoop参数优化
- 面向移动设备的HTML5开发框架梳理