【C++】继承(虚基类)
类的继承与派生
面向对象技术强调软件的可重用性,这种重用性通过继承机制来实现。而在类的继承过程中,被重用的原有类称为基类,新创建的类称为派生类。派生类定义语法格式如下:
class <派生类名> : <继承方式> <基类名1>, <继承方式> <基类名2> ...... { <派生类成员的定义>; }
继承方式控制着派生类成员以及派生类对象如何访问从基类继承来的成员;“:”后只有一个基类为单继承,有多个基类为多继承。
派生类的构造函数和析构函数
由于基类的构造函数和析构函数不能被继承,在派生类中,如果对派生类新增的成员进行初始化,就必须为派生类添加新的构造函数。
构造函数
派生类从基类继承了非私有成员函数和数据成员,但在创建派生类对象时,系统执行派生类的构造函数,而不会自动执行基类的构造函数。如果基类的构造函数包含对基类数据的初始化,那么在设计派生类的构造函数时,还应为初始化基类数据成员提供参数,所有这些参数在派生类的构造函数中都以初始化列表的形式提供,语法格式如下:
<派生类名>(<形参表>) : <基类名1>(<形参表1>), <基类名2>(<形参表2>) ...... { <派生类新增数据成员的初始化>; }
在创建派生类对象时,系统是使用派生类的构造函数参数表所提供的参数,首先去调用基类的构造函数。
析构函数
在执行派生类的析构函数时,基类的析构函数也将被自动调用,它们的顺序恰好与派生类的构造函数的调用顺序相反,先派生类的析构函数,后基类的析构函数。
虚基类
多重继承可能会带来多义性问题,C++中的作用域分辨符和虚基类技术都可解决此问题,但最好尽量不要使用多继承。
作用域分辨符就是类域标记"::",语法格式如下:
<派生类对象名>.<基类名>::<成员函数名>(<参数表>);
虚基类是消除多义性的另一种简单而有效的方法。对于可能在不同派生路径中产生多个成员副本的基类,可以将其设为虚基类,这样在内存中,它的数据成员就只有一个副本,成员函数也只有一个映射,从而解决了同名成员函数的唯一标识问题。
虚基类有关键字virtual 标识,语法格式如下:
class <派生类名>:virtual <继承方式> <基类名>
使用作用域分辨符时,基类的成员在内存中有多个副本,通过制定基类名来唯一标识使用副本,这样可以存放不同的数据,进行不同的操作。使用虚基类技术,是基类的成员在内存中只有一个副本。相比之下,前者可以容纳更多的数据,后者形式更加简洁,更节省内存空间。可根据实际情况选择合适的方式。
【C++】继承(虚基类)的更多相关文章
- C/C++ 多继承{虚基类,虚继承,构造顺序,析构顺序}
C/C++:一个基类继承和多个基类继承的区别 1.对多个基类继承会出现类之间嵌套时出现的同名问题,如果同名变量或者函数出现不在同一层次,则底层派生隐藏外层比如继承基类的同名变量和函数,不会出现二义性, ...
- C++ (P160—)多继承 二义性 虚基类 “向上转型”
1 多继承中,必须给每个基类指定一种派生类型,如果缺省,相应的基类则取私有派生类型,而不是和前一个基类取相同的派生类型 2 一个类的保护成员只能被本类的成员函数或者它的派生类成员函数访问 3 由于c+ ...
- C++学习之路—继承与派生(三):多重继承与虚基类
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 多重继承是指一个派生类有两个或多个基类.例如,有 ...
- C++ 多继承与虚基类
转载来自:CSDN insistGoGo (http://blog.csdn.net/insistgogo) 多继承的定义:派生类的基类大于一个 语法: class 派生类名:继承方式1 基类名1 ...
- C#虚基类继承与接口的区别
类:定义新的数据类型以及这些新的数据类型进行相互操作的方法 定义方式: class Cat { } class Cat:object { } C#中所有的类都是默认由object类派生来的,显示指定或 ...
- C++ 类的继承六(多继承的二义性--虚基类)
//多继承的二义性--虚基类(了解为主) #include<iostream> using namespace std; /* 多继承在现在的项目开发中一般不使用,他会增加项目的复杂度 * ...
- C++ 虚基类 派生与继承
在学习设计模式时我就有一个疑问,关联和继承除了用法上的区别,好像在内存上并没有什么区别,继承也是父类作为了子类的元素(内存上),关联也是这样.而且关联好像更占内存一些.这就是设计模式里问题了“依赖倒转 ...
- YTU 2622: B 虚拟继承(虚基类)-沙发床(改错题)
2622: B 虚拟继承(虚基类)-沙发床(改错题) 时间限制: 1 Sec 内存限制: 128 MB 提交: 487 解决: 393 题目描述 有一种特殊的床,既能当床(Bed)用又能当沙发(S ...
- C++ 由虚基类 虚继承 虚函数 到 虚函数表
//虚基类:一个类可以在一个类族中既被用作虚基类,也被用作非虚基类. class Base1{ public: Base1(){cout<<"Construct Base1!&q ...
随机推荐
- 编写Windows服务疑问2:探索服务与安装器的关系
首先,来弄两个服务,一个叫“飞机”,一个叫“火车”. public class FeiJiService : ServiceBase { public FeiJiService() { Service ...
- jQuery之常用且重要方法梳理(target,arguments,slice,substring,data,trigger,Attr)-(一)
1.jquery data(name) data() 方法向被选元素附加数据,或者从被选元素获取数据. $("#btn1").click(function(){ $(" ...
- Angular Service和Factory应用的区别
Service可以用来将返回同类业务的多种返回值 Factory可以用来提供对同类业务的多个方法的调用 另外:Provider可以用来封装各独立职责
- 初识AngularJS 之 HelloWorld和数据绑定
1.Hello World 我用的开发工具是 atom ,大家有需要的话可以找我要安装包嘻嘻 第一步: 写入以下代码: <!DOCTYPE html> <html ng-ap ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(48)-工作流设计-起草新申请
系列目录 创建新表单之后,我们就可以起草申请了,申请按照严格的表单步骤和分支执行. 起草的同时,我们分解流转的规则中的审批人并保存,具体流程如下 接下来创建DrafContoller控制器,此控制器只 ...
- Android okHttp网络请求之Json解析
前言: 前面两篇文章介绍了基于okHttp的post.get请求,以及文件的上传下载,今天主要介绍一下如何和Json解析一起使用?如何才能提高开发效率? okHttp相关文章地址: Android o ...
- Linux下的磁盘分割和文件系统
一.各硬件装置在Linux下的文件名 1.IDE硬盘机 在Linux内的文件名: /dev/hd[a-d] (a-d 刚好是四个这个是有原因的具体如下) 解释:以 IDE 接口来说,由于一个 IDE ...
- spring boot(三):Spring Boot中Redis的使用
spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结 ...
- request中getParameter和getAttribute的区别
整理一下getParameter和getAttribute的区别和各自的使用范围. (1)HttpServletRequest类有setAttribute()方法,而没有setParameter()方 ...
- 关于join时显示no join predicate的那点事
我们偶尔,非常偶尔的情况下会在一个查询计划中看到这样的警告: 大红叉,好吓人啊! 把鼠标放上去一看显示这样的信息 No join predicate 直译过来就是:没有连接谓词 在真实的生产环境下我们 ...