2017/03/19学习笔记

继承中的同名成员变量处理方法

1.当子类成员变量和父类成员变量同名时
2.子类依然从父类继承同名变量
3.在子类中通过作用域分辨符::进行同名成员区分(在子类中使用父类的同名成员,显式地使用类名限定符)
4.同名成员存储在内存中的不同位置

继承中的static关键字

继承和stataic关键字在一起会产生什么现象?
1.父类定义的静态成员,将被子类所共享
2.根据静态成员自身的访问特性和子类的继承方式,在类层次体系中具有不同的访问性质(遵守子类的访问控制)
3.子类中访问静态成员,用以下形式:
类名::成员
或通过对象名 对象名.成员

#### C++中构造函数没有写访问修饰符默认是私有的,继承的时候会编译出错.

多继承的应用

多继承的概念

一个类有多个直接的父类继承关系称为多继承
语法:
class 子类:访问修饰符 父类1,访问修饰符 父类2,......,访问修饰符 父类n{
}

多继承的子类构造和访问

多个父类的子类构造函数可以用初始式调用父类构造函数初始化数据成员
执行顺序与单继承情况类似。多个父类构造函数执行顺序取决于定义子类时指定的顺序
一个子类对象拥有多个直接或间接的父类成员。不同名成员访问不会出现二义性。如果不同的父类有同名成员,子类对象访问时应该加以识别。

当继承中出现二义性的时候可以使用虚继承(virtual)解决(由同一个祖父类继承而来的二义性),

多继承和虚继承是一种摈弃的用法,不推荐使用

多态原理探究

理论知识:

1) 当类中声明虚函数时,编译器会在类中生成一个虚函数表。
2) 虚函数表示一个存储类成员函数指针的数据结构
3) 虚函数表是由编译器自动生成和维护的
4) virtual成员函数会被编译器放入虚函数表中
5) 存在虚函数时,每个对象中都有一个指向虚函数表的指针
6) VPTR一个作为对象的第一个成员
7) 虚函数表指针是在构造函数执行之前被赋值,还是在构造函数被赋值后赋值?

多态实现效果

同样的调用语句有多种不同的表现形态.

多态实现的三个条件

继承、virtual重写、父类指针(引用)指向子类对象.

多态的C++实现

virtual关键字,告诉编译器这个函数要支持多态;不要根据指针类型判断如何调用;而是根据指针所指向的实际对象类型来判断如何调用。

多态的理论基础

动态联编PK静态联编.根据实际的对象类型来判断重写函数的调用

多态的重要意义

设计模式的基础

实现多态的理论基础

函数指针作函数参数
C函数指针是C++至高无上的荣耀。C函数指针一般有两种用法(正,反)

静态联编和动态联编

1.联编是指一个程序模块、代码之间相互关联的过程。
2.静态联编(static binding),是程序的匹配、链接在编译阶段实现,也称为早期匹配。(重载函数使用静态联编)
3.动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编(迟绑定)。
switch语句和if语句是动态联编的例子。
C++和C相同,是静态联编型语言
在编译时,编译器自动根据指针类型判断指向的是一个什么样的对象,所以编译器认为父类指针指向的是父类对象。
由于程序没有运行,所以不能指定父类指针所指向的具体是父类对象还是子类对象。
从程序安全角度,编译器假设父类指针指向父类对象,因此编译的结果为调用父类的成员函数。

C++多态的实现

virtual关键字,告诉编译器这个函数要支持多态;不要根据指针类型判断如何调用;而是根据指针所指向的实际对象类型来判断如何调用。virtual关键字修饰的函数叫虚函数。虚函数分:一般虚函数和纯虚函数.

虚析构函数

构造函数不能是虚函数。建立一个子类对象时,必须从类层次的根开始,沿着继承路径逐个调用父类的构造函数。
析构函数可以是虚的。虚析构函数用于指引delete运算符正确的析构动态对象。

函数重载:
必须在同一个类中进行。
子类无法重载父类的函数,父类同名函数将被名称覆盖
重载是在编译期间根据参数类型和个数决定函数调用
函数重写:
必须发生在父类和子类之间
并且父类和子类中的函数必须有完全相同的原型
使用virtual声明后能够产生多态(如果不使用virtual,那叫重定义)
多态是在运行期间根据具体对象类型决定函数调用.

时间: 2024-10-03 14:02:53

2017/03/19学习笔记的相关文章

2017/03/31学习笔记

双向链表 单向链表的节点都只有一个指向下一个节点的指针单向链表的数据元素无法直接访问其前驱元素逆序访问单向链表中的元素时极其耗时的操作双向链表在单向链表的基础上增加了指向前驱的指针功能上双向链表可以完全取代单向链表的使用 栈是一种特殊的线性表 栈仅能在线性表的一端进行操作栈顶:允许操作的一端栈底:不允许操作的一端首先它是一个线性表,也就是说,栈元素具有线性关系,即前驱后继关系.只不过它是一种特殊的线性表.定义中说是在线性表的表尾进行插入和删除操作,这里表尾是指栈顶,而不是栈底.他的特殊之处就在于

2017/03/27学习笔记

程序的输入是指从输入文件讲数据传送给程序,程序的输出是指从程序将数据传送输出文件.C++输入输出包含以下三方面内容:对系统指定标准设备的输入和输出.即从键盘输入数据,输出到显示器.这种输入输出称为标准输入输出,简称标准IO.以外出磁盘文件为对象进行输入输出,即从磁盘文件输入数据,将数据输出到文件.以外存为对象的输入输出称为文件的输入输出,简称文件IO.度内存中指定的空间进行输入输出,通常指定一个字符串数组作为储存空间(实际上可以利用该空间储存任何信息).这种输入输出称为字符串输入输出,简称串IO

2017/03/24学习笔记

类型转换 C语言中的强制类型转换很简单,不管什么类型的转换都是TYPE b=(TYPE)a; C++中类型转换提供了4种类型转换操作符来应对不同场合的应用.static_cast 静态转换.如int转换成charreinterpreter_cast 重新解释类型dynamic_cast 命名上理解是动态类型转换.如子类和父类之间的多态类型转换 (父类转子类,向下转型)const_cast 字面理解就是去const属性. 4种类型转换格式TYPE b=static_cast<TYPE>(a);

2017/03/17学习笔记

智能指针类 指针使用过程中,经常会出现内存泄漏和内存多次被释放.解决方案:boost库的智能指针项目开发中,要求开发者使用预先编写的智能指针类对象代替C语言中原生的指针.智能指针思想工程中的智能指针是一个类模板通过构造函数接管申请的内存通过析构函数确保堆内存被及时释放通过重载指针运算符*和->来模拟指针的行为通过重载比较运算符==和!=来模拟指针的比较 为什么不要重载&&和||操作符 &&和||是C++中非常特殊的操作符&&和||内置实现了短路规则操作

2017/03/11学习笔记

.lib资源模式文件 描述 .dll.dll 动态库(函数二进制码集合,里面有函数的函数体),动态库有规范(win/linux)下不一样. mtrace 是linux C编程内存泄漏检测工具,mtrace是三款工具中最简单易用的,mtrace是一个C函数,在<mckeck.h>里面声明及定义.其实mtrace是类似malloc_hook的malloc handler,只不过mtrace的hander function已由系统为你写好,既然如此,系统又怎么知道您想将malloc/free的记录写

2017/03/13学习笔记

cout<<标准输出cin>>标准输入定义一个类,是一个抽象概念,不会给你分配内存.用数据类型定义变量的时候,才会分配内存. C语言是在实践的过程中逐步完善起来的.没有深思熟虑的设计过程.使用时存在很多的"灰色地带"残留量过多低级语言的特征直接利用指针进行内存操作.C语言的目标是高效最终程序执行效率的高效C语言和C++并不是对立的竞争关系.C++ 是C语言的加强,是一种更好的C语言.C++ 是以C语言的为基础,并且完全兼容C语言的特性 C语言中无法取得regis

2017/03/09学习笔记

加密分为:对称加密和非对称加密对称加密:加密的秘钥和解密的密钥一样运算速度快,适合做大数据加密,强度弱eg :des 3des AES196 512....非对称加密:加密的密钥和解密的密钥不一样.运算速度慢适合做小数据加密,强度大 安全eg:rsa1024 2048 ECC椭圆曲线(SM系列)加密三要素:明文 密文 密钥 散列 哈希(指纹)(不可逆) 对称加密的原理:分组(按密钥长度分组,最后以加密 padding方式打补丁)

2017/03/08学习笔记

结构体深copy和浅copy问题 编译器的=号操作,只会把结构体中指针变量的值copy,但不会重新开辟内存空间.//出现浅copy出现的场景是,结构体里面有指针成员的时候.如果需要执行深copy,需要手动显示分配内存,然后手动copy指针成员所执行的数据. 结构体偏移量定义下来,则结构体中的成员 内存布局就定义下来了,可以通过成员地址去求结构体的内存地址 文件操作 文件的分类按文件的逻辑结构分为记录文件:由具有一定结构的记录组成(定长和不定长)流式文件:由一个个字符(字节)数据顺序组成.按存储介

2017/03/16学习笔记

//void oper(int a,int b) const ;==>void oper(const className* const this,int a,int b); 运算符重载 所谓重载,就是重新赋予新的含义.函数重载就是对一个已有的函数赋予新的含义,使之实现新功能,因此,一个函数名就可以用来代表不同的功能函数,也就是一名多用.运算符也可以重载.实际上,我们已经不知不觉中使用了运算符重载.如,大家都习惯用加法运算符"+"对整数.浮点数进行加法运算 5+8.5.8+3.67