【C++】继承(虚基类)
类的继承与派生
面向对象技术强调软件的可重用性,这种重用性通过继承机制来实现。而在类的继承过程中,被重用的原有类称为基类,新创建的类称为派生类。派生类定义语法格式如下:
class <派生类名> : <继承方式> <基类名1>, <继承方式> <基类名2> ...... { <派生类成员的定义>; }
继承方式控制着派生类成员以及派生类对象如何访问从基类继承来的成员;“:”后只有一个基类为单继承,有多个基类为多继承。
派生类的构造函数和析构函数
由于基类的构造函数和析构函数不能被继承,在派生类中,如果对派生类新增的成员进行初始化,就必须为派生类添加新的构造函数。
构造函数
派生类从基类继承了非私有成员函数和数据成员,但在创建派生类对象时,系统执行派生类的构造函数,而不会自动执行基类的构造函数。如果基类的构造函数包含对基类数据的初始化,那么在设计派生类的构造函数时,还应为初始化基类数据成员提供参数,所有这些参数在派生类的构造函数中都以初始化列表的形式提供,语法格式如下:
<派生类名>(<形参表>) : <基类名1>(<形参表1>), <基类名2>(<形参表2>) ...... { <派生类新增数据成员的初始化>; }
在创建派生类对象时,系统是使用派生类的构造函数参数表所提供的参数,首先去调用基类的构造函数。
析构函数
在执行派生类的析构函数时,基类的析构函数也将被自动调用,它们的顺序恰好与派生类的构造函数的调用顺序相反,先派生类的析构函数,后基类的析构函数。
虚基类
多重继承可能会带来多义性问题,C++中的作用域分辨符和虚基类技术都可解决此问题,但最好尽量不要使用多继承。
作用域分辨符就是类域标记"::",语法格式如下:
<派生类对象名>.<基类名>::<成员函数名>(<参数表>);
虚基类是消除多义性的另一种简单而有效的方法。对于可能在不同派生路径中产生多个成员副本的基类,可以将其设为虚基类,这样在内存中,它的数据成员就只有一个副本,成员函数也只有一个映射,从而解决了同名成员函数的唯一标识问题。
虚基类有关键字virtual 标识,语法格式如下:
class <派生类名>:virtual <继承方式> <基类名>
使用作用域分辨符时,基类的成员在内存中有多个副本,通过制定基类名来唯一标识使用副本,这样可以存放不同的数据,进行不同的操作。使用虚基类技术,是基类的成员在内存中只有一个副本。相比之下,前者可以容纳更多的数据,后者形式更加简洁,更节省内存空间。可根据实际情况选择合适的方式。
最新文章
- 网站文件系统发展&;&;分布式文件系统fastDFS
- Java进击C#——语法之线程同步
- cs程序添加初始化加载
- DecimalFormat类
- Markdown入门教程
- 【DPDK】虚拟机开发环境配置
- Android四大组件之Service
- linux samba.tar.gz安装和配置
- PHP 冒泡排序法
- 【HDOJ】3416 Marriage Match IV
- Properties/Property文件读取(键值均)乱码问题!
- HDU -2670 Girl Love Value
- hdu 2031
- 临时节点不能有child 子节点
- Objective-C处理动态类型函数集
- 关于Java内存管理的几个小技巧
- Ehcache 的简单实用 及配置
- 修改MyEclipse编辑框背景色
- Ubuntu部署python3.7的开发和运行环境
- MMIO和PIO
热门文章
- vue-router2.0 组件之间传参及获取动态参数
- 04. Web大前端时代之:HTML5+CSS3入门系列~HTML5 表单
- 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
- ASP.NET 5 - $.ajax post JSON.stringify(para) is null
- 使用ETag进行session的降级
- Oracle数据逻辑迁移综合实战篇
- 读书笔记--SQL必知必会07--创建计算字段
- 安卓Design包之TabLayout控件的简单使用
- MyCat源码分析系列之——SQL下发
- WCF Basics - FAQs Series【WCF基础----问答系列教程】