【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 ...
随机推荐
- iOS----应用的旋转---Orientations
此博文主要针对IOS应用, 是屏幕旋转相关问题的一个总结. 主要内容有: IOS5,6,7不同版的适配. 强制旋转和自动旋转. QQ : 1101819159 邮箱: GeekiVan@aliyun. ...
- ASP.NET Core中的依赖注入(2):依赖注入(DI)
IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用"好莱坞原则"是应用程序以被动的方式实现对流程的定制.我们可以采用若干设计 ...
- EasyUI中那些不容易被发现的坑——EasyUI重复请求2次的问题
问题控件:datagrid.combobox.所有能设置url属性的控件 问题版本:1.4.4.1.4.5(之前的版本没测) 问题如图: 重复请求2次,错误代码如图: 错误问题分析:html加载的时候 ...
- android使用ImageLoader实现图片缓存(安卓开发必备)
相信大家在学习以及实际开发中基本都会与网络数据打交道,而这其中一个非常影响用户体验的就是图片的缓存了,若是没有弄好图片缓存,用户体验会大大下降,总会出现卡顿情况,而这个问题尤其容易出现在ListVie ...
- 打造高效前端工作环境-tmuxinator
前言 虽然tmux能让我们方便组织工作环境,但每次重新打开会话时都需要手动重新创建窗口.窗格和执行各种程序,能不能像VS那样以工程为单位保存窗口.窗格和各种所需执行的程序的信息呢?tmuxinato ...
- 浅玩JavaScript的数据类型判断
前言 平常在需要进行类型判断时,随手拿起typeof就像手枪一样只管突突突...也没有仔细的去了解它的具体特性. 所以这里就利用空闲时间,来做一个较为详细的了解. 首先我们来全面看一遍typeof类型 ...
- VC程序获取管理员权限
一: 编译程序的时候设置一下 在项目属性--连接器--清单文件--UAC执行级别改为requireAdministrator 二: void GainAdminPrivileges(CString s ...
- StackExchange.Redis客户端读写主从配置,以及哨兵配置。
今天简单分享一下StackExchange.Redis客户端中配置主从分离以及哨兵的配置. 关于哨兵如果有不了解的朋友,可以看我之前的一篇分享,当然主从复制文章也可以找到.http://www.cnb ...
- asp.net分页控件
一.说明 AspNetPager.dll这个分页控件主要用于asp.net webform网站,现将整理代码如下 二.代码 1.首先在测试页面Default.aspx页面添加引用 <%@ Reg ...
- wpf 列表、菜单 收起与展开,通过Grid DoubleAnimation或者Expander实现
菜单收缩有很多种方法具体如何实现还是看个人想法: 第一种通过后台控制收起与展开: 效果图: 代码 : <Grid> <Grid.ColumnDefinitions> <C ...