再谈C++继承
一、三种继承方式
private 基类的公有成员与保护成员成为派生类的私有成员
public 基类的成员访问权限不变
protected 基类的公有成员与保护成员将成为派生类的保护成员
二、三种继承方式的对比:

三、在没有虚函数的情况下,类指针调用函数是注意:
- 如果以一个基类指针指向派生类对象,那么经由该指针只能调用基类所定义的函数
- 如果你以一个派生类的指针指向一个基类对象,你必须先做明显的强制转换,但是这样做很危险
- 如果基类和派生类都定义了相同名的成员函数,那么通过对象指针调用成员函数时候,调用的函数是由指针的原始类型而定,而不是看指针指向的对象的类型而定
四、虚函数表:
定义:
为了达到动态绑定(后期绑定)的目的,C++编译器通过某个表格,在执行期"间接"调用实际上欲绑定的函数(注意"间接"字眼).这样的表格称为虚函数表(常被称为vtable).每一个"内含虚函数的类",编译器都会为它做一个虚函数表,表中的每一个元素都指向一个虚函数的地址.此外,编译器当然会为这个类加上一项成员变量,是一个指向这个虚函数表的指针(常被称为vptr),且每个由此派生出来的对象,都会有这个一个vptr.
介绍:
当我们通过这个对象调用虚函数时,事实上是通过vptr找到虚函数,再找出真实的地址,虚函数表用这种间接的的方式,虚函数表的内容是依据类中的虚函数声明次序,意义填入函数表(以及所有其他可以继承的成员),当我们在派生类中改写虚函数时,虚函数表就受了影响:表中元素所指的函数地址将不再是基类的函数地址,而是派生类的地址
单继承
声明格式:
class 派生类名:继承方式(若不具体指出默认为private) 基类名 { … };
特性:
继承了基类所有属性与行为,包括私有成员,但不允许派生类直接访问基类私有成员
构造函数:
格式: 派生类构造函数名(形参表):基类构造函数名(形参表){…}
要点:
● 创建派生类对象时,程序首先创建基类对象,即基类对象应在进入派生类构造函数前被创建完成 (即先调用基类构造函数,后调用派生类构造函数) ● 派生类构造函数应通过成员初始化表将基类信息传递给基类构造函数 ● 派生类构造函数应初始化派生类新增的数据成员
析构函数:
特性: 派生类对象过期时,程序将首先调用派生类析构函数,然后调用基类的
虚析构函数:
作用: 和虚函数一样类似,在用基类指针释放派生类对象时候,为了能调用正确的析构函数.
注意: 当一个类有虚函数功能,它经常作为一个基类使用,并且它的派生类经常使用new来分配,那么它最好也使用虚析构函数,因为这样才能保证在释放实例对象的时候调用正确的析构函数
注意:
- 构造函数的调用次序为 基类 -> 派生类
- 析构函数的调用次序为 派生类 -> 基类
多继承
声明格式:
class 派生类名:继承方式 基类名,继承方式 基类名… {….};
构造函数:
- 形式:
派生类名::派生类名(形参表):基类名(形参表),基类名(形参表)…{…}
- 特点:
处理同一层的基类构造函数的执行顺序取决于定义派生类对各基类的排列顺序,与定义派生类的构造函数时基类的排列顺序无关
- 二定义性:
原因:
- 由于多层次的交叉派生类关系,造成一个派生类对象包含了基类成员的多个副体
- 多个基类中某个成员名相同
方法:
- 用虚基类来解决由于多层次的交叉派生类关系(原理:采用虚基类定义方式定义派生类,在创建派生类时,类层次结构中某个虚基类的成员只保留一个,即虚基类成员的一个副本被所有派生类共享)
- 用基类中定义成员的访问修改方法来解决多个基类中某个成员名相同
虚基类:
声明格式: class 派生类名:virtual 继承方式 基类名,… { … };
注意:
- virtual与继承方式之间的次序无关且将基类作为虚基类,计算机为此完成一些额外计算量慎用
- 一个类可以在一个类族中用作虚基类,也可以用作非虚基类.
- 在派生类的对象中,同名的虚基类只产生一个虚基类子对象,而某个非虚基类产生各自的对象.
- 虚基类子对象是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的.
- 最派生类是指在继承结构中建立对象时所指定的类.
- 在派生类的构造函数的成员初始化列表中,必须列出对虚基类构造函数的调用,如果没有列出,则表示使用该虚基类的缺省构造函数.
- 在虚基类直接或间接派生的派生类中的构造函数的成员初始化列表中,都要列出对虚基类构造函数的调用.但只有用于建立对象的最派生类的构造函数调用虚基类的构造函数,而该派生类的所有基类中列出的对虚基类构造函数的调用在执行中被忽略,从而保证对虚基类子对象只初始化一次.
- 在一个成员初始化列表中,同时出现对虚基类和非虚基类构造函数的调用时,基类的构造函数先于非虚基类的构造函数执行
有虚基类和无虚基类的区别:
- 有虚基类:
构造函数的顺序与继承顺序有关,而不是基类构造函数的调用有关
再谈C++继承的更多相关文章
- lesson 4 再谈继承多态,抽象类和接口
再谈多态,抽象类和接口 上一次博客已经概念性的概述了继承多态,抽象类和接口,这次来具体的谈一谈他们之间的联系和需要注意的地方. 一.继承和多态:Inheritance (继承) & Polym ...
- Java继承之再谈构造器
目录 Java继承之再谈构造器 初始化基类 默认构造器 带参数的构造器 子类调用父类构造器 Java继承之再谈构造器 初始化基类 前面提到,继承是子类对父类的拓展.<Thinking in Ja ...
- 再谈angularJS数据绑定机制及背后原理—angularJS常见问题总结
这篇是对angularJS的一些疑点回顾,是对目前angularJS开发的各种常见问题的整理汇总.如果对文中的题目全部了然于胸,觉得对整个angular框架应该掌握的七七八八了.希望志同道合的通知补充 ...
- 沉淀再出发:再谈java的多线程机制
沉淀再出发:再谈java的多线程机制 一.前言 自从我们学习了操作系统之后,对于其中的线程和进程就有了非常深刻的理解,但是,我们可能在C,C++语言之中尝试过这些机制,并且做过相应的实验,但是对于ja ...
- Python学习6——再谈抽象(面对对象编程)
1.对象魔法 在面对对象编程中,术语对象大致意味着一系列数据(属性)以及一套访问和操作这些数据的方法. 使用对象而非全局变量以及函数的原因有多个,而最重要的好处不过以下几点: 多态:可对不同类型的对象 ...
- Python基础 第7章 再谈抽象
1. 1 多态 多态,即便不知道变量指向的是哪种对象,也能对其执行操作,且操作的行为将随对象所属的类型(类)而异. 1.2 多态与方法 当无需知道对象是什么样的就能对其执行操作时,都是多态在起作用. ...
- 再谈Java数据结构—分析底层实现与应用注意事项
在回顾js数据结构,写<再谈js对象数据结构底层实现原理-object array map set>系列的时候,在来整理下java的数据结构. java把内存分两种:一种是栈内存,另一种是 ...
- 再谈js对象数据结构底层实现原理-object array map set
如果有java基础的同学,可以回顾下<再谈Java数据结构—分析底层实现与应用注意事项>:java把内存分两种:一种是栈内存,另一种是堆内存.基本类型(即int,short,long,by ...
- mui初级入门教程(四)— 再谈webview,从小白变“大神”!
文章来源:小青年原创发布时间:2016-06-05关键词:mui,html5+,webview转载需标注本文原始地址: http://zhaomenghuan.github.io/#!/blog/20 ...
随机推荐
- Python学习总结11:获取当前运行类名和函数名
一. 使用内置方法和修饰器方法获取类名.函数名 1. 外部获取 从外部的情况好获取,可以使用指向函数的对象,然后用__name__属性. def a(): pass a.__name__ 或者 get ...
- .NET: WPF Template
Data Template: 要做一个listBox,里面有车子的简单信息,点了里面的item后就会显示详细信息. car class: using System; using System.Coll ...
- C++初学者 const使用详解
关于C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,参考了康建东兄的const使用详解一文,对其中进行了一些补充,写下了本文. 1. const常量 如: cons ...
- CCF真题之图像旋转
201503-1 问题描述 旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度. 计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可. 输入格式 ...
- EXTJS 5 开发环境搭建
WEBstrom eclipse下载: http://www.eclipse.org/downloads/ spket 下载: 安装方式: http://wangke0611.iteye.com/bl ...
- CSS(Cascading Style Sheet,叠层样式表),作用是美化HTML网页。
CSS(Cascading Style Sheet,叠层样式表),作用是美化HTML网页. /*注释区域*/ 此为注释语法 一.样式表 (一)样式表的分类 1.内联样式表 和HTML联合显示,控 ...
- JetBrains WebStorm 8 注册码
UserName:William===== LICENSE BEGIN =====45550-1204201000001SzFN0n1bPII7FnAxnt0DDOPJAINauvJkeVJBuE5b ...
- 写sql语句分别按日,星期,月,季度,年统计
--写sql语句分别按日,星期,月,季度,年统计销售额 --按日 ' group by day([date]) --按周quarter ' group by datename(week,[date]) ...
- Openstack的HA解决方案【mysql集群配置】
使用mysql的galera做多主集群配置,galera的集群优势网络上面有对比,这里不在叙述. 1. 新建3台虚拟机(centos6.5) node1:172.17.44.163 node2:172 ...
- COM编程之三 QueryInterface
[1]IUnknown接口 客户同组件交互都是通过接口完成的. 在客户查询组件的其它接口时,也是通过接口完成的.而那个接口就是IUnknown. IUnknown接口的定义包含在Win32SDK中的U ...