C++学习-11
- 虚函数表,调试下断点,指针的自动变量
含有虚函数的类,它的内部含有虚指针指向虚函数表,此时的空类占有4个字节,不管有多少个虚函数,只需要一个虚函数指针指向虚函数表就可以了
- 构造函数不可以是虚函数,如果是虚函数,子类对象中的父类拷贝无法初始化
关于virtual的理解,继承肯定就是完完整整的把父类包含进去,父类的vitual函数直接被虚化掉,直接链接到子类的那个override函数上。如果子类没有重写,那么就还是依赖于父类的函数上(这个过程就是依赖于虚函数指针)
总结virtual:1.含有虚函数的类,本身就会隐式的含有一个函数指针,用于实现virtual的多态 2.只要是继承,子类就会完完整整的包含,由于函数是virtual,含有隐式指针,所以当函数在实现多态的时候,隐式指针就会帮助实现多态,当然子类要是没有重写,那就还是使用父类的函数
不管有多少层虚函数或者多少个,虚函数指针只需要一个足矣
- 继承的本质就是子类中完完全全包含父类
使用多态的时候,析构函数必须为虚函数,构造函数一定不能为虚函数
在继承链中,构造函数执行的顺序是:父-子,如果是虚函数,那么就会直接跳转到子构造,父类数据就没有后办法进行初始化了
析构函数的执行顺序是:子->父,只有通过析构时虚函数,才能先指向子类的析构函数,然后再转到父类的析构函数,这样才能不造成内存泄漏
- 需要注意的是,在你找到了所谓的函数地址之后
还要对应转换成对应的函数指针类型
总结:虚函数表可以在你的虚函数不管是不是私有的,我都完全可以访问到
- 抽象类:无法创建实例对象,用于被继承(含有纯虚函数)
纯虚函数作为一个借口,一旦继承了,就必须实现纯虚函数的接口
主要是用于提供接口
- 都是在虚函数的前提下:final 声明为final的虚函数不能重写,必须对应虚函数
- override声明一下,我重写了虚函数接口,为的是一个软件工程规范,会自动检测虚函数是否存在
- 虚函数或者纯虚函数存储了虚函数表的地址
单纯的只是虚函数,不管在一个类中有多少个虚函数,还是在继承链中有多少个虚函数,都只需要一个指针指向虚函数表就可以了
虚基类的虚继承:为的就是节约内存,本质是完全包含子类,但是虚继承之后,相同的类就只包含一个,而是用指针去代替,
虚函数加4,管的是整个继承链上面的
虚继承加4只管一层
- 继承权限class默认为private,struct默认为public.虚函数是可以调用成员函数或者变量
多态依赖于指针或者引用调用。对象调用,会调用拷贝构造,拷贝一个父类,无法实现多态
只要有虚函数,就必须把析构函数虚化virtual
虚函数是可以重载的(重载不被继承调用,继承调用就不重载)只要一个类的虚函数重载了,继承链就不会识别
虚函数已经被继承了,还是虚函数。多态可以跨类
- 子类同名函数会覆盖父类,父类指针存储子类地址,有虚函数的情况下,调用子类方法,否者调用父类
Dynam_cast<>()只能识别多态数据类型,转换失败返回null,必须要有虚函数才可以实现转换
只能转换指针或者引用,不能转换对象,
可以自动把子类指针转换为父类指针
父类转到子类就用dynamic_cast<子类>(父类)-------前提是这个父类指针或者引用 多态绑定于子类对象
- 代码重用:模板,继承,类的包含
模板可以体现在:数据类型,操作
类包类(把类当成员)
类的继承,选择性继承
- 函数模板:就是一个通用的模板
模板函数:就是一个模板被实例化了的函数
无论有无默认参数,模板都不可以加virtual
继承无重载,重载无继承
函数模板和成员函数可以相互调用
重载就是为了解决模板的匹配问题
类模板必须实例化
12. Tfun<double>()模板类的匿名对象,构造函数
如果一个类的成员函数是模板,不能实现虚函数
如果你的类是模板类,
模板之间是支持多态和继承的,但是模板之间的类型要一致
template<class T>
class Tzi :public Tfu<T>要求的前提是模板的类型要一致
TT(1)类类模板之间可以封装继承多态(可以实现模板参数为函数参数的泛型,毕竟后面可以接泛型T为参数)
TP T必须和P的类型要一样(模板必须得实例化,和P一样) (这个虽说可以用,但是最好是没有联系,毕竟联系了,泛型也就失去意义了,一实例化就失去泛型的特性了)
PT 必须明确类型,多态什么类型都可以(模板在底下,没限制)随你定义的子类类型再形成新的
PP(1)可以实现封装多态继承
总结:类模板的模板类型是根据你显式的定义的类型再去初始化内部的模板类型(这个是定义类型再去初始化数据类型)
恰恰相反的是:函数模板是根据数据类型自动推理模板类型,类中的函数模板不能virtual
对于一个类模板而言,模板的类型必须确定了这个类才算完整,才能进行调用
TP:想要实现继承,在继承的时候,你的T的模板类型必须是确定的,
- 类中的函数模板是不能virtual的,类模板的成员函数是可以virtual
(原因在于,类在使用的时候必须初始化你的模板类型这个时候在继承的时候就已经进行了限制和统一,而函数模板完全是根据你给的数据进行推断,万一两个类型你给的不一样,那么显然啊会抛出异常,所以直接不行)这里谈的是TT和P(t) P(t)其中继承链中必须都是对应的模板走法
- TT,TP,PT,PP这些走法归于一 点就在于(类模板在使用的时候必须是要把模板类型实例化才行的,不管是在创建对象的时候,还是在继承链这个关系下。)其实你这个所谓的模板真正在继承链中的作用并不大
当模板作为数据成员,继承的意义不大,在下一个子类中你就的声明你的类型才能使用,模板的泛型就失去了,
在使用带有模板的时候,你的注意后续的类能不能接你的参数即可
C++学习-11的更多相关文章
- JavaScript学习11 数组排序实例
JavaScript学习11 数组排序实例 数组声明 关于数组对象的声明,以前说过:http://www.cnblogs.com/mengdd/p/3680649.html 数组声明的一种方式: va ...
- ThinkPhp学习11
原文:ThinkPhp学习11 一.模板的使用 (重点) a.规则 模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件[i ...
- 【Spark深入学习-11】Spark基本概念和运行模式
----本节内容------- 1.大数据基础 1.1大数据平台基本框架 1.2学习大数据的基础 1.3学习Spark的Hadoop基础 2.Hadoop生态基本介绍 2.1Hadoop生态组件介绍 ...
- springboot实战(汪云飞)学习-1-1
java EE开发的颠覆者 spring boot 实战 随书学习-1 1.学习案例都是maven项目,首先要在eclipse 中配置 maven,主要修改maven的配置文件:配置文件下载链接: h ...
- django学习-11.开发一个简单的醉得意菜单和人均支付金额查询页面
1.前言 刚好最近跟技术部门的[产品人员+UI人员+测试人员],组成了一桌可以去公司楼下醉得意餐厅吃饭的小team. 所以为了实现这些主要点餐功能: 提高每天中午点餐效率,把点餐时间由20分钟优化为1 ...
- python爬虫学习(11) —— 也写个AC自动机
0. 写在前面 本文记录了一个AC自动机的诞生! 之前看过有人用C++写过AC自动机,也有用C#写的,还有一个用nodejs写的.. C# 逆袭--自制日刷千题的AC自动机攻克HDU OJ HDU 自 ...
- ExtJS4.2学习(11)可拖放的表格(转)
鸣谢:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-11-18/180.html --------------- ...
- Swift编程语言学习11—— 枚举全局变量、局部变量与类型属性
全局变量和局部变量 计算属性和属性监视器所描写叙述的模式也能够用于全局变量和局部变量,全局变量是在函数.方法.闭包或不论什么类型之外定义的变量,局部变量是在函数.方法或闭包内部定义的变量. 前面章节提 ...
- OC学习11——循环引用与@class
转载自 OC学习篇之---@class关键字的作用以及#include和#import的区别 一.#import和#include的区别 当我们在代码中使用两次#include的时候会报错:因为#in ...
- python 的基础 学习 11天 作业题
1.整理函数相关知识点,写博客 2.写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者. def func1(argv): li = [] for i in r ...
随机推荐
- python并发编程之多进程(三):共享数据&进程池
一,共享数据 展望未来,基于消息传递的并发编程是大势所趋 即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合 通过消息队列交换数据.这样极大地减少了对使用锁定和其他同步手段的需求, 还可以扩展 ...
- 单元测试——Qunit
为什么需要单元测试 正确性:测试可以验证代码的正确性,在上线前做到心里有底 自动化:当然手工也可以测试,通过console可以打印出内部信息,但是这是一次性的事情,下次测试还需要从头来过,效率不能得到 ...
- 基于Jquery+Ajax+Json+存储过程 高效分页
在做后台开发中,都会有大量的列表展示,下面给大家给大家分享一套基于Jquery+Ajax+Json+存储过程高效分页列表,只需要传递几个参数即可.当然代码也有改进的地方,如果大家有更好的方法,愿留下宝 ...
- (MonoGame从入门到放弃-2) 初识MonoGame
上一节记录了大致的搭建MonoGame的环境,默认大家都是都是使用过Visual Studio的,没使用过的话,可以去https://www.visualstudio.com/下载一个试试,社区版免费 ...
- Hibernate入门这一篇就够了
前言 本博文主要讲解介绍Hibernate框架,ORM的概念和Hibernate入门,相信你们看了就会使用Hibernate了! 什么是Hibernate框架? Hibernate是一种ORM框架,全 ...
- R-CNN算法概要
参考论文:Rich feature hierarchies for accurate object detection and semantic segmentation 下载地址:https://a ...
- 相位噪声 dBc/Hz
相位噪声和抖动是对同一种现象的两种不同的定量方式.在理想情况下,一个频率固定的完美的脉冲信号(以1 MHz为例)的持续时间应该恰好是1微秒,每500ns有一个跳变沿.但不幸的是,这种信号并不存在.如图 ...
- 如何进行系统配置 ——了解DOS下的内存
DOS操作系统最早设计时,PC机的硬件系统只支持1M字节的寻址空间,所以DOS只能管理最多1M字节的连续内存空间.在这1M内存中,又只有640K被留给应用程序使用,它们被称为常规内存或基本内存,其它3 ...
- 关于编译FFMPEG的初级教程
首先我们要下载相关工具,这里不多说,大家按照我的地址去下载文件就好了 MINGW下载地址:http://prdownloads.sourceforge.net/mingw/MinGW-3.1.0-1. ...
- [php错误]PHP中Notice: unserialize(): Error at offset of bytes in on line 的解决方法
使用unserialize函数将数据储存到数据库的时候遇到了这个报错, 后来发现是将gb2312转换成utf-8格式之后, 每个中文的字节数从2个增加到3个之后导致了反序列化的时候判断字符长度出现了问 ...