C++面向对象编程 -- 继承、多态和文件操作
继承、多态和文件操作
- 继承
- 继承方式
- 继承中的对象模型
- 继承中的构造和析构
- 继承中同名成员的处理方式
- 继承同名静态成员处理方式
- 多继承语法
- 菱形继承
- 多态
- 多态的基本概念
- 动态多态满足的条件
- 多态的优点
- 纯虚函数和抽象类
- 纯虚函数
- 虚析构和纯虚析构
- 文件操作
- 文本文件
- 写文件
- 文件打开方式
- 读文件
- 二进制文件
- 读文件
继承
- 继承是面向对象的三大特性之一
- 好处:减少重复代码
- 语法:
class 子类 : 继承方式 父类
- 子类:派生类
- 父类:基类
继承方式
- 语法:
class 子类 : 继承方式 父类
- 继承方式:
○ 公共继承
■public
和protected
权限不变
■ 父类中私有成员不能访问
○ 保护继承
■public
和protected
都成为protected
成员
■ 父类中私有成员不能访问
○ 私有继承
■ 父类中的所有成员都变成private
■ 父类中私有成员不能访问
继承中的对象模型
● 父类中所有非静态成员属性都会被子类继承
● 父类中的私有成员只是被编译器隐藏,不能访问,但是实际被继承了
继承中的构造和析构
● 继承中的构造:先构造父类,再构造子类
;
● 继承中的析构:先析构子类,再析构父类
;
继承中同名成员的处理方式
- 问题:当子类与父类出现同名的成员,如何通过子类对象,访问到子类或者父类中同名的数据呢?
○ 访问子类同名成员:直接访问即可;
○ 访问父类同名成员:需要加作用域;
■ 如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类所有同名的成员函数;
■ 如果想访问,必须加作用域;
继承同名静态成员处理方式
- 问题:继承中同名的静态成员在子类对象上如何进行访问?
○ 静态成员和非静态成员出现同名,处理方式一致;
○ 访问子类:直接访问;
○ 访问父类:加作用域
;
多继承语法
- C++允许一个类多继承;
○ 语法:class 子类 : 继承方式 父类, 继承方式 父类, ……
;
○ 多继承可能会引发父类中有同名成员出现,需要加作用域区分;
○ C++实际开发中不建议使用多继承;
菱形继承
- 菱形继承概念:
○ 两个派生类继承同一个基类;
○ 又是某个类同时继承两个派生类;
○ 这种继承成为菱形继承或者钻石继承; - 关键字:
virtual
○ 在继承的时候加上关键字后变成虚继承;
○ 虚继承中相同的数据是共享的;
多态
多态的基本概念
- 多态是面向对象的三大特征之一
○ 多态的分为两类
■ 静态多态:函数重载和运算符重载属于静态多态,服用函数名;
■ 动态多态:派生类和虚函数实现运行时多态;
○ 静态多态和动态多态的区别
■ 静态多态的函数地址早绑定 - 编译阶段确定函数地址;
■ 动态多态的函数地址晚绑定 - 运行阶段确定函数地址;
动态多态满足的条件
- 有继承关系;
- 子类重写父类的虚函数;
○ 虚函数:函数前用virtual关键字说明;
○ 重写:函数返回值类型相同、函数名相同、函数参数列表完全相同;
多态的优点
- 代码组织结构清晰;
- 可读性强;
- 利于前期和后期的扩展以及维护;
○ 开闭原则:对扩展进行开放,对修改进行关闭;
纯虚函数和抽象类
纯虚函数
- 语法:
virtual 返回值类型 函数名 (参数列表) = 0;
- 当类中有了纯虚函数,这个类成为抽象类;
- 抽象类特点:
○ 无法实例化对象;
○ 子类必须重写抽象类中的纯虚函数,否则也属于抽象类;
虚析构和纯虚析构
问题:多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码;
○ 父类指针指向父类的对象,则在父类析构的时候,不会调用子类中的析构函数,导致子类如果有堆区属性,出现泄漏。解决方式:将父类中的析构函数改为虚析构或者纯虚析构;
○ 纯虚析构:既要声明也要实现,及需要在内外将其实现,不然不能通过编译;虚析构和纯虚析构的共性
○ 可以解决父类指针释放子类对象;
○ 都需要具体的函数实现;虚析构和纯虚析构的区别
○ 如果是纯虚析构,该类属于抽象类,无法实例化;虚析构语法:
virtual ~类名(){}
纯虚析构语法:
virtual ~类名() = 0;
文件操作
程序运行时产生的数据都属于零时数据,程序一旦运行结束都会被释放;
通过文件可以将数据持久化;
C++中对文件操作需要包含头文件
<fstream>
;文件类型分为两种:
○ 文本文件:文件以文本的ASCII码形式存储在计算机中,用户一般不能直接读懂它们;操作文件的三大类:
○ ofstream:写操作
○ ifstream:读操作
○ fstream:读写操作
文本文件
写文件
- 步骤
○ 包含头文件:#include <fstream>;
○ 创建流对象:ofstream ofs;
○ 打开文件:ofs.open("文件路径",打开方式);
○ 写数据:ofs << "写入的数据";
○ 关闭文件:ofs.close();
文件打开方式
打开方式 | 解释 |
---|---|
ios::in | 为读文件而打开文件 |
ios::out | 为写文件而打开文件 |
ios::ate | 初始位置:文件尾 |
ios::app | 追加方式写文件 |
ios::trunc | 如果文件存在先删除,再创建 |
ios::binary | 二进制方式 |
○ 注意:文件打开方式可以配合,利用 | 操作符;
○ 例如:用二进制方式写文件ios::binary | ios::out
//
// Created by NJUST'er'wang's on 2022/1/18.
//文本文件 写文件
#include <iostream>
#include <fstream>
using namespace std;void test01(){/* 1、包含头文件* 2、创建流对象* 3、指定打开方式* 4、写内容* 5、关闭文件* */ofstream ofs;ofs.open("test.txt",ios::out);ofs << "姓名:王东" <<endl;ofs <<"性别:男"<<endl;ofs.close();
}
int main(){test01();return 0;
}
读文件
- 读文件与写文件步骤相似,但是读取方式相对于比较多;
- 步骤
○ 包含头文件:#include <fstream>
○ 创建流对象:ifstream ifs
;
○ 打开文件并判断文件是否打开成功:ifs.open("文件路径",打开方式);
○ 读数据:四种读方式;
○ 关闭文件:ifs.close();
//
// Created by NJUST'er'wang's on 2022/1/18.
//文本文件 读文件
#include <iostream>
#include <fstream>
#include <string>
using namespace std;void test01(){/* 1、包含头文件* 2、创建流对象* 3、打开文件 并且判断是否打开成功* 4、读数据* 5、关闭文件* */ifstream ifs;ifs.open("test.txt",ios::in);if(!ifs.is_open()) {cout<<"打开文件失败!"<<endl;return ;}
- 读数据
//first methodchar buf[1024] = {0};while (ifs >> buf){cout<<buf<<endl;}
//second methodchar buf2[1024] = {0};while(ifs.getline(buf2,sizeof(buf2))){cout<<buf2<<endl;}
//third methodstring str;while (getline(ifs,str)){cout<<str<<endl;}
//forth methodchar ch;while ((ch = ifs.get()) != EOF ) //EOF end of file{cout<<ch;}
ifs.close();
}
int main()
{test01();return 0;
}
/*控制台输出:
姓名:王东
性别:男
*/
二进制文件
- 以二进制的方式对文件进行读写操作;
- 打开方式指定为:
ios::binary
写文件 - 二进制文件主要利用流对象调用成员函数
write
- 函数原型:
ostream& write(const char * buffer,int len);
- 参数解释:字符指针
buffer
指向内存中一段存储空间。len
是读写的字节数;
//
// Created by NJUST'er'wang's on 2022/1/18.
//二进制文件 写文件
#include <iostream>
#include <fstream>
#include <cstring>using namespace std;class Person {char name[10];int age;
public:Person(char name[10], int age) {strcpy(this->name, name);this->age = age;}char *getName() { return name; }int getAge() { return age; }};void test01() {/* 1、包含头文件* 2、创建流对象* 3、打开文件* 4、写文件* 5、关闭文件* */ofstream ofs;ofs.open("Person.txt", ios::out | ios::binary);Person p = {"唐潇", 24};ofs.write((const char *) &p, sizeof(Person));ofs.close();
}int main() {test01();return 0;
}
读文件
- 二进制方式读文件主要利用流对象调用成员函数
read
; - 函数原型:
istream& read(char *buffer,int len);
- 参数解释:字符指针
buffer
指向内存中一段存储空间。len
是读写的字节数;
//
// Created by NJUST'er'wang's on 2022/1/18.
//二进制文件的读文件
#include <iostream>
#include <fstream>
#include <cstring>using namespace std;class Person {char name[10];int age;
public:Person() {}Person(char name[10], int age) {strcpy(this->name, name);this->age = age;}char *getName() { return name; }int getAge() { return age; }};void test01() {/* 1、包含头文件* 2、创建流对象* 3、判断是否打开成功* 4、读文件* 5、关闭文件* */ifstream ifs;ifs.open("Person.txt", ios::in | ios::binary);if (!ifs.is_open()) {cout << "打开文件失败!" << endl;return;}Person p;ifs.read((char *) &p, sizeof(Person));cout << "name: " << p.getName() << ' ' << "age: " << p.getAge() << endl;ifs.close();
}int main() {test01();return 0;
}
/*
name: 唐潇 age: 24*/
C++面向对象编程 -- 继承、多态和文件操作相关推荐
- C# 面向对象编程【多态详解】
C# 面向对象编程[多态详解] 文章目录 C# 面向对象编程[多态详解] 1. 里氏转换 2. 多态 2.1 虚方法 3.2 抽象类 3.3 接口 1. 里氏转换 1).子类可以赋值给父类 2).如果 ...
- C++基础知识 —— 内存分区模型、引用、函数重载、类和继承、this指针、友元、多态、文件操作
参考 黑马程序员 C++课程笔记,个人理解及整理 可以使用 在线编译c++代码 来简单验证.学习代码 目录 C++核心编程 1. 内存分区模型 1.1 程序运行前 1.2 程序运行后 1.3 ...
- 浅学 ----- C++ 继承和多态,文件操作
文章目录 继承 继承方式 继承中的对象类型 继承中构造函数和析构顺序 继承同名成员处理方式 继承同名静态成员处理方式 多继承语法 菱形继承 多态 纯虚函数和抽象类 虚析构和纯虚析构 文件操作 文本文件 ...
- 面向对象封装继承多态五大基本原则魔法方法反射
目录 面向对象 三大基本特征 五大基本原则 魔法方法 反射 面向对象 什么是面向对象 使用模板的思想,将世界万事万物使用对象来表示一个类型 面向对象和面向过程的区别: 面向对象的不就是使用程序处理事情 ...
- python中继承和组合的区别_Py修行路 python基础 (十五)面向对象编程 继承 组合 接口和抽象类...
一.前提回忆: 1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均 ...
- 大数据笔记8—java基础篇4(面向对象-封装-继承-多态)
面向对象 一.面向对象 1.面向过程 1.2.举例 1.3.总结 二.面向对象 1.简述 2.举例 3.思想特点 2.1.类的定义格式 2.1.1.简述 2.2.2.格式 2.3.3.示例 三.类的使 ...
- 面向对象编程中多态的快速理解
1,函数重写回顾: 父类中被重写的函数依然会继承给子类: 子类中重写的函数将覆盖父类中的函数: – 重写父类当中提供的函数是因为父类当中提供的这个函数版本不能满足我们的需求,因此我们要重写: – 期望 ...
- C 语言编程 — 输入/输出与文件操作
目录 文章目录 目录 前文列表 输入/输出 scanf() 和 printf() getchar() 和 putchar() 文件操作 打开文件 关闭文件 写入文件 读取文件 二进制 I/O 函数 前 ...
- Linux环境编程(4)文件操作相关内容补充
Linux环境编程(4) 文件同步: 1.在写入数据时内存与磁盘之间也有一个缓冲区,这种机制降低了磁盘读写次数,提高了读写的效率. 2.但这种机制带来的后果就是磁盘中的数据与实写入的数据不匹配,系统提 ...
最新文章
- 《windows核心编程系列》十八谈谈windows钩子
- 什么牌子的千兆网卡好用_男士面膜什么牌子好 10款平价好用的男士面膜推荐
- adobexd怎么录屏_请问如何使用Adobe XD制作应用动效?
- linux webrtc浏览器,WebRTC 浏览器支持
- 斯蒂文斯理工学院计算机博士,美国斯蒂文斯理工大学——招收全奖土木工程博士生 - 导师招生 - 小木虫 - 学术 科研 互动社区...
- VS 之 InstallShield Limited Edition for Visual Studio 2015 图文教程
- ECNUOJ 2615 会议安排
- linux 远程赋值,linux 简单远程复制命令scp参数
- 连接池和 Timeout expired异常【转】
- 【图像处理】MATLAB:图像噪声
- PCL Lesson1 :PCL库PCLVisualizer的简单使用
- office如何去除多页签
- 电子邮件如何运行(MTA,MDA,MUA)
- 【广工考试笔记】计算机系统结构考试速成笔记
- ArcGIS修改默认文件地理数据库
- linux 误删文件恢复
- win7系统如何映射服务器,win7系统如何映射网络驱动器 win7系统映射网络驱动器方法...
- deepin连接投影仪显示不完全
- CentOS6.5搭建asterisk及配置软电话
- miniUI实现指定行可编辑,其他行仍然只读