C++拾遗(十一)类继承
首先,这里提到的继承都是公用继承。
派生类
1、派生类需要添加自己的构造函数。
2、派生类创建之前会首先创建基类对象,即调用基类构造函数。在派生类构造函数后通过初始化列表将参数传递给基类构造函数。
3、派生类的构造函数主要用于初始化新增的数据成员。
4、释放对象时与创建相反,先调用派生类的析构函数再调用基类的析构函数。
关于派生类的使用:
1、派生类可以使用基类的非私有方法。
2、派生类不能访问基类的私有成员。
另外:
1、基类指针可以指向派生类。
2、基类引用可以引用派生类对象。
但是这种基类指针、引用只能使用基类的方法,不能使用派生类独有的方法。
隐藏
基类和派生类同名的成员函数,无论参数是否相同,只要同名都构成隐藏。
此时派生类实例化的对象默认使用派生类的成员函数,若要使用基类下的同名函数要如此使用:children.Father::function();
同名的成员变量同理。
多态公有继承
实现有两种方法:
1、使用virtual 虚方法。
2、在派生类中重新定义基类的方法。
virtual的意义
没有virtual,根据引用类型或者指针类型选择调用的方法。
有virtual,根据引用或者指针指向的对象的类型选择调用的方法。
析构函数通常是virtual的,这可以保证析构函数被正确地调用。
静态联编与动态联编
联编:编译器将源代码中的函数调用解释为执行特定的函数代码。
静态联编:编译过程中进行联编。
动态联编:运行时决定使用哪个方法。编译器对虚方法使用动态联编。
虚函数表
只有类中有虚函数的类才会有虚函数表。以下摘自http://www.cnblogs.com/Ripper-Y/archive/2012/05/15/2501930.html


图中vtable就是该类的虚函数表。
可以看到,如果派生类中没有重新定义基类中的虚函数,则虚函数表中仍然保存的是原始版本的虚函数。
以下图片及资料来自:http://blog.csdn.net/haoel/article/details/1948051/
在多重继承时:
左为继承关系,右为一个子类实例中的虚表。

1、子类实例中的虚函数表中每个父类都有一个自己的虚表,而且子类独有的虚函数放在第一个父类的虚表中。
2、子类在重新定义父类中有的虚函数时,会同时覆盖所有虚表的该虚函数。
抽象基类
有纯虚函数的类是一个抽象基类,只能作为基类,不能创建实例,其它的类成员函数可以定义。纯虚函数声明类似 virtual fun() = 0;
C++拾遗(十一)类继承的更多相关文章
- Python基础(十一) 类继承
类继承: 继承的想法在于,充份利用已有类的功能,在其基础上来扩展来定义新的类. Parent Class(父类) 与 Child Class(子类): 被继承的类称为父类,继承的类称为子类,一个父类, ...
- 《C++ Primer Plus》读书笔记之十一—类继承
第十三章 类继承 1.类继承:扩展和修改类. 2.公有继承格式:冒号指出B类的基类是A,B是派生类. class B :public A { ... }: 3.派生类对象包含基类对象.使用公有派生,基 ...
- Core Java (十一) Java 继承,类,超类和子类
Core Java (十一) Java 继承,类,超类和子类 标签: javaJavaJAVA 2013-01-22 17:08 1274人阅读 评论(0) 收藏 举报 分类: java(58) 读 ...
- Programming In Scala笔记-第十一章、Scala中的类继承关系
本章主要从整体层面了解Scala中的类层级关系. 一.Scala的类层级 在Java中Object类是所有类的最终父类,其他所有类都直接或间接的继承了Object类.在Scala中所有类的最终父类为A ...
- 快学Scala 第十一课 (类继承)
类继承: class People { } class Emp extends People{ } 和Java一样,final的类不能被继承.final的字段和方法不能被override. 在Scal ...
- Java12-java语法基础(十一)继承
Java12-java语法基础(十一)继承 一.继承 学习要求: 1. 理解继承的概念与作用 2. 掌握继承的实现机制 3.理解继承中的覆写与覆盖 4.掌握super关键字的使用 回顾: 1.对客观世 ...
- javascript类继承的一些实验
其实一开始编js没怎么用过对象,一般都用func,func,func···但是用多了,感觉代码一点都不美观,还要这里包一个函数,那里包一个函数,或者一直都是函数调用,不好看,而且一些重用的都要重写的话 ...
- C++ 类继承的对象布局
C++多重继承下,对象布局与编译器,是否为虚拟继承都有很大关系,下面将逐一分析其中的差别,相同点为都按照类继承的先后顺序布局(类内按照虚表.成员声明先后顺序排列).该类情况为子类按照继承顺序排列,如c ...
- C++中public,protected,private派生类继承问题和访问权限问题
C++中public,protected,private派生类继承问题和访问权限问题 当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1. ...
- Javascript类继承-机制-代码Demo【原创】
最近看到<Javascript设计模式>,对js模拟的”继承方式“有了更深一步的了解,虽然之前也总是用到prototype.new ,但只是知其然不知所以然,现在将类继承的方法整理如下,暂 ...
随机推荐
- 【转】 Ubuntu samba服务器搭建及测试--不错
原文网址:http://blog.csdn.net/longfeey/article/details/5937968 Ubuntu samba服务配置是很不错的文件应用很有学习价值, 这里我主要讲解U ...
- NET设计模式(2):单件模式(Singleton Pattern)[转载]
单件模式(Singleton Pattern) ——.NET设计模式系列之二 Terrylee,2005年12月07日 概述 Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问 ...
- javascript 关闭窗口,弹出新窗口并带有确认关闭对话框解决办法
在很多人眼里,北京是一个物欲横流的社会,生活节奏之快,让你一丝都不能停下来,走在路上伴随着人群急速往前涌,或许有些人都不知道要去哪.也不知道自己想要的是什么?在一个浮躁的社会里,多了一些浮躁的人,到处 ...
- Swift基础语法学习总结一
1.基础 1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift使用print和println打印,它的传参是一个泛型,几乎所有类型都是可打印的. ...
- Java的多线程(上)
多线程的优点和必要性是不言而喻的. 三种方法实现多线程 1. 继承Thread class A extends Thread{ public void run() {...} } 使用时, new A ...
- 如何安装Windows 8系统中的telnet组件
知识点分析:Window 8 系统中Telnet没有默认安装,成为了一个可选组件,“启用或关闭Windows功能”下即可添加此组件. 操作步骤:1.系统桌面下同时按住键盘上 “Windows” 和“X ...
- python Eve RESTFul 尝试笔记
0.前言 最近重点研究了yeelink平台的原理和使用,yeelink平台和多数云平台设计一样应用了RESTFul框架.嵌入式侧(或者是客服端侧)的相关技术研究的比较充分(个人这么认为),是不是该弄弄 ...
- Cocos2D-X2.2.3学习笔记12(瞬间动作)
到眼下我们已经学习了有 坐标系统 内存管理 UI系统 事件处理 几何图形 今天我们来学习动作管理OK 我们来看看类结构图 CCAction 全部动作的基类 以下派生了三个子类:CCFiniteTi ...
- Android进程机制
以下资料摘录整理自老罗的Android之旅博客,是对老罗的博客关于Android底层原理的一个抽象的知识概括总结(如有错误欢迎指出)(侵删):http://blog.csdn.net/luosheng ...
- 用Hexo搭建属于自己的Blog
什么是Hexo 简单的来说,Hexo是一款基于Node.JS的静态博客框架,官方给它的描述是"A fast, simple & powerful blog framework&quo ...