类的继承与派生

  面向对象技术强调软件的可重用性,这种重用性通过继承机制来实现。而在类的继承过程中,被重用的原有类称为基类,新创建的类称为派生类。派生类定义语法格式如下:

    class <派生类名> : <继承方式> <基类名1>, <继承方式> <基类名2> ......    {      <派生类成员的定义>;    }

  继承方式控制着派生类成员以及派生类对象如何访问从基类继承来的成员;“:”后只有一个基类为单继承,有多个基类为多继承。

派生类的构造函数和析构函数

  由于基类的构造函数和析构函数不能被继承,在派生类中,如果对派生类新增的成员进行初始化,就必须为派生类添加新的构造函数。

构造函数

  派生类从基类继承了非私有成员函数和数据成员,但在创建派生类对象时,系统执行派生类的构造函数,而不会自动执行基类的构造函数。如果基类的构造函数包含对基类数据的初始化,那么在设计派生类的构造函数时,还应为初始化基类数据成员提供参数,所有这些参数在派生类的构造函数中都以初始化列表的形式提供,语法格式如下:  

    <派生类名>(<形参表>) : <基类名1>(<形参表1>), <基类名2>(<形参表2>) ......    {      <派生类新增数据成员的初始化>;    }

  在创建派生类对象时,系统是使用派生类的构造函数参数表所提供的参数,首先去调用基类的构造函数。

析构函数

  在执行派生类的析构函数时,基类的析构函数也将被自动调用,它们的顺序恰好与派生类的构造函数的调用顺序相反,先派生类的析构函数,后基类的析构函数。

虚基类

  多重继承可能会带来多义性问题,C++中的作用域分辨符和虚基类技术都可解决此问题,但最好尽量不要使用多继承。

  作用域分辨符就是类域标记"::",语法格式如下:

    <派生类对象名>.<基类名>::<成员函数名>(<参数表>);

  虚基类是消除多义性的另一种简单而有效的方法。对于可能在不同派生路径中产生多个成员副本的基类,可以将其设为虚基类,这样在内存中,它的数据成员就只有一个副本,成员函数也只有一个映射,从而解决了同名成员函数的唯一标识问题。

  虚基类有关键字virtual 标识,语法格式如下:

    class <派生类名>:virtual <继承方式> <基类名>

  使用作用域分辨符时,基类的成员在内存中有多个副本,通过制定基类名来唯一标识使用副本,这样可以存放不同的数据,进行不同的操作。使用虚基类技术,是基类的成员在内存中只有一个副本。相比之下,前者可以容纳更多的数据,后者形式更加简洁,更节省内存空间。可根据实际情况选择合适的方式。

【C++】继承(虚基类)的更多相关文章

  1. C/C++ 多继承{虚基类,虚继承,构造顺序,析构顺序}

    C/C++:一个基类继承和多个基类继承的区别 1.对多个基类继承会出现类之间嵌套时出现的同名问题,如果同名变量或者函数出现不在同一层次,则底层派生隐藏外层比如继承基类的同名变量和函数,不会出现二义性, ...

  2. C++ (P160—)多继承 二义性 虚基类 “向上转型”

    1 多继承中,必须给每个基类指定一种派生类型,如果缺省,相应的基类则取私有派生类型,而不是和前一个基类取相同的派生类型 2 一个类的保护成员只能被本类的成员函数或者它的派生类成员函数访问 3 由于c+ ...

  3. C++学习之路—继承与派生(三):多重继承与虚基类

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 多重继承是指一个派生类有两个或多个基类.例如,有 ...

  4. C++ 多继承与虚基类

    转载来自:CSDN insistGoGo  (http://blog.csdn.net/insistgogo) 多继承的定义:派生类的基类大于一个 语法: class  派生类名:继承方式1 基类名1 ...

  5. C#虚基类继承与接口的区别

    类:定义新的数据类型以及这些新的数据类型进行相互操作的方法 定义方式: class Cat { } class Cat:object { } C#中所有的类都是默认由object类派生来的,显示指定或 ...

  6. C++ 类的继承六(多继承的二义性--虚基类)

    //多继承的二义性--虚基类(了解为主) #include<iostream> using namespace std; /* 多继承在现在的项目开发中一般不使用,他会增加项目的复杂度 * ...

  7. C++ 虚基类 派生与继承

    在学习设计模式时我就有一个疑问,关联和继承除了用法上的区别,好像在内存上并没有什么区别,继承也是父类作为了子类的元素(内存上),关联也是这样.而且关联好像更占内存一些.这就是设计模式里问题了“依赖倒转 ...

  8. YTU 2622: B 虚拟继承(虚基类)-沙发床(改错题)

    2622: B 虚拟继承(虚基类)-沙发床(改错题) 时间限制: 1 Sec  内存限制: 128 MB 提交: 487  解决: 393 题目描述 有一种特殊的床,既能当床(Bed)用又能当沙发(S ...

  9. C++ 由虚基类 虚继承 虚函数 到 虚函数表

    //虚基类:一个类可以在一个类族中既被用作虚基类,也被用作非虚基类. class Base1{ public: Base1(){cout<<"Construct Base1!&q ...

随机推荐

  1. 我为NET狂官方面试题

    基础牢不牢测一测便了解,工作没工作测一测便清楚,工作有几年测一测便知道 最近帮人过一遍C#基础,出了点题目,有需要的同志拿走 答案不唯一,官方答案只供参考,若有错误欢迎提出~ 更新ing 1.面向过程 ...

  2. ITTC数据挖掘平台介绍(四) 框架改进和新功能

    本数据挖掘框架在这几个月的时间内,有了进一步的功能增强 一. 超大网络的画布显示虚拟化     如前几节所述,框架采用了三级层次实现,分别是数据,抽象Node和绘图的DataPoint,结构如下:   ...

  3. SSRS ----环境配置,没有 ReportServer DB 怎么办?

    今天项目进入报表开发阶段,按照习惯,打开报表管理器,发现提示下面的错误: 错误:报表服务器无法打开与报表服务器数据库的连接.所有请求和处理都要求与数据库建立连接. 这是怎么回事儿呢,经过排查,发现数据 ...

  4. Linux 解决数量庞大wildfly容器启动与停止的脚本

    一.问题 因公司业务的发展,后台架构的变更,导致测试环境(Linux)部署与管理困难成倍增长,duang的一下,增加N倍.进入正题说问题: 问题1.  测试环境包含普通用户环境.开发者用户环境,原来只 ...

  5. 深入理解定时器系列第一篇——理解setTimeout和setInterval

    × 目录 [1]setTimeout [2]setInterval [3]运行机制[4]作用[5]应用 前面的话 很长时间以来,定时器一直是javascript动画的核心技术.但是,关于定时器,人们通 ...

  6. 利用rebase来压缩多次提交

    我们可以用Git merge –squash来将分支中多次提交合并到master后,只保留一次提交历史.但是有些提交到github远程仓库中的commit信息如何合并呢? 历史记录 首先我们查看一下m ...

  7. Rafy 框架 - 通用查询条件(CommonQueryCriteria)

    在应用开发过程中,有 80% 的场景下,开发者所需要的实体查询,查询条件中其实都是一些简单的属性匹配,又或是一些属性匹配的简单组合.Rafy 为这样的场景提供了更为方便使用的 API:CommonQu ...

  8. C#基础知识八之访问修饰符

    1.  类的访问修饰符 修饰符 访问权限 无或者internal 只能在同一个程序集中访问类 public 同一个程序集或引用该程序集的外部都可访问类 abstract或internal abstra ...

  9. 01windows窗体程序学习

    静态用户名和密码的登录练习 private void button2_Click(object sender, EventArgs e) { textUser.Text = Convert.ToStr ...

  10. screen命令

    基本用法 screen -S testname 在这里面执行命令,即使终端突出,进程也不会断掉 screen -list查看有哪些screen screen -r testname 恢复