继承:
好处:减少重复代码
语法:class 子类:继承方式 父类
子类也称为派生类,父类也称为基类。
继承中的对象模型:
父类中所有的非静态成员都会被子类继承。
利用开发人员命令提示工具查看对象模型:
跳转盘符 C:
跳转文件路径 cd 具体路径下
查看命名
cl /d1 reportSingleClassLayout类名 文件名
继承中的构造和析构顺序:
先构造父类再构造子类
先析构子类再析构父类
继承中同名成员处理方式:
访问子类同名成员:直接访问即可
访问父类同名成员:需要加作用域
如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员函数。
如果想访问到父类中被隐藏的同名成员函数,需要加作用域。
继承同名静态成员的处理方式:
静态成员和非静态成员出现同名,处理方式一致。
可以通过成员访问也可以通过类名访问。
多继承语法:
c++允许一个类继承多个类。
语法:class 子类:继承方式 父类1,继承方式 父类2...
多继承可能会引发父类中有同名成员出现,需要加作用域区分。
(实际开发中不建议使用多继承)
多态的基本概念:
静态多态:函数重载和运算符重载属于静态多态,复用函数名。
动态多态:派生类和虚函数实现运行时多态。
区别:
静态多态的函数地址早绑定-编译阶段确定函数地址。
动态多态的函数地址晚绑定-运行阶段确定函数地址。
动态多态满足条件:
1 有继承关系
2 子类重写父类中的虚函数
重写:函数返回值类型 函数名 参数列表 完全相同
动态多态的调用:
父类的指针或者引用,指向子类对象。
父类内部结构
vfptr-虚函数(表)指针
v-virtual
f-function
ptr-pointer
指向vftable 表内记录虚函数的地址
子类内部结构
vfptr指向vftable
表内记录父类虚函数的地址
当子类重写父类的虚函数
子类中的虚函数表内部会替换成子类的虚函数地址
开闭原则:对扩展进行开放,对修改进行关闭
多态好处:
1 组织结构清晰
2 可读性强
3 对于前期和后期扩展和维护性高
纯虚函数和抽象类:
在多态中,通常父类中虚函数的实现是无意义的,主要都是调用子类重写的内容。
因此可以将虚函数改为纯虚函数。
纯虚函数语法:
virtual 返回值类型 函数名 (参数列表) = 0;
当类中有了纯虚函数,这个类也成为抽象类。
抽象类特点:
1 无法实例化对象
2 子类必须重写抽象类中的纯虚函数,否则也属于抽象类。
虚析构和纯虚析构:
多态使用中,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码。
解决方式:将父类中的析构函数改为虚析构或者纯虚析构。
虚析构和纯虚析构共性:
1 可以解决父类指针释放子类对象
2 都需要有具体的函数实现
虚析构和纯虚析构区别:
如果是纯虚析构,该类属于抽象类,无法实例化对象。
总结:
1 虚析构或纯虚析构是用来解决通过父类指针释放子类对象。
2 如果子类中没有对区数据,可以不写纯虚析构或虚析构。
3 拥有纯虚析构函数的类也属于抽象类。
文件操作:
程序运行时产生的数据都属于临时数据程序,一旦运行结束,都会被释放。
通过文件可以将数据持久化。
c++中对文件操作需要包含头文件<fstream>
文件类型分为两种:
1 文本文件:
文件以文本的ASCII码形式存储在计算机中
2 二进制文件:
文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂他们。
操作文件的三大类:
1.ofstream:写操作
2.ifstream:读操作
3.fstream:读写操作
写文件步骤:
1.包含头文件
#include<fstream>
2.创建流对象
ofstream ofs;
3.打开文件
ofs.open(“文件路径”,打开方式);
4.写数据
ofs<<“写入的数据”;
5.关闭文件
ofs.close();
文件打开方式:
注意:文件打开方式可以配合使用,利用|操作符。
读取文件数据的四中方法:
char buf[1024] = {0};
while(ifs>>buf)
{
cout<<buf<<endl:
}
char buf[1024]={0};
while(ifs.getline(buf,sizeof(buf)))
string buf;
while(getline(ifs,buf))
char c;
while((c=ifs.get())!=EOF)
//end of line
cout c
前三种逐行读取,效率较高。
可以利用is_open函数判断文件是否打开成功
二进制文件:
打开方式要指定为ios::binary
写文件:
二进制方式写文件,主要利用流对象调用成员函数write
函数原型:ostream& write(const char* buffer, int len);
参数解释:字符指针buffer指向内存中一段存储空间,len是读写字节数。
文件输入流对象,可以通过read函数,以二进制方式读数据。