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 ,但只是知其然不知所以然,现在将类继承的方法整理如下,暂 ...
随机推荐
- CSS中.和#区别
一.问题来源 制作导航栏,参考别人的代码,发现的. 二.解析 2.1 概述 id:用来定义页面中大的样式,如栏目划分,顶部,正文,底部等:用#top的形式来定义: class:用来定义一些比较细节的样 ...
- perl中执行linux命令,及其区别
1. system("date '+%Y-%m-%d %H:%M:%S'") 该命令返回的是-1.(应该是date命令的main函数的返回值) 2. `date '+%Y-%m-% ...
- dojox.grid.EnhancedGrid 和 dojox.grid.DataGrid 的继承关系
dojox.grid.EnhancedGrid 的介绍说, EnhancedGrid 是基于 DataGrid 提供增强功能的. EnhancedGrid (dojox.grid.EnhancedG ...
- tengine rpm制作
最近又在centos6.4下折腾tengine了,刚好不久前看了rpm包的制作方法,所以又有了搞个rpm包的想法. 1 安装centos的开发环境集成包及tengine的依赖包 1 yum group ...
- 支付宝开通海外退税 阿里腾讯暗战跨境O2O_21世纪网
支付宝开通海外退税 阿里腾讯暗战跨境O2O_21世纪网 支付宝开通海外退税 阿里腾讯暗战跨境O2O
- GitHub for Mac
GitHub for Mac 安装 1.从 mac.github.com 下载最新版本的 GitHub. 2.当你开启软件时,你可以选择用你的 GitHub 账户登录,或者新建一个账户. 3.在左侧, ...
- C#中枚举类型和int类型的转化
先定义一个枚举类型 , 初中, 高中,大学 }; int ->enum int d=2; PropertyType a=(PropertyType)d; int <- enum Prop ...
- JQuery Mobile页面的载入方式
1.JQM页面结构 jQuery Mobile是通过data-role属性来区分渲染界面样式的,JQM里面提供的data-role如下表: 参数 说明 page 页面容器,其内部的mobile元素将会 ...
- Oracle 数据库基本操作——表操作:查询
目录: 1.基本查询 2.多表查询 3.多行查询 4.集合查询 2.连接 3.嵌套查询 1.基本查询 语法: select column|others{,columnName|others} from ...
- python网上开发执行环境
http://www.tutorialspoint.com/execute_python_online.php