类和对象-多态project09

news/2025/11/2 16:55:46/文章来源:https://www.cnblogs.com/maylet/p/19183947

多态的基本语法project9 filename01

多态分为两类
静态多态:函数重载和运算符重载属于静态多态,复用函数名
动态多态:派生类和虚函数实现运行时多态
静态多态和动态多态区别
静态多态的函数地址早绑定-编译阶段确定函数地址
动态多态的函数地址晚绑定-运行阶段确定函数阶段

include

using namespace std;
class Animal {
public:
void virtual speak() {
cout << "动物在说话" << endl;
}
};
class cat:public Animal {
public:
void speak() {
cout << "小猫在说话" << endl;
}
};
//执行说话的函数
//地址早绑定 在编译阶段确定函数地址
//如果想执行让猫说话,那么这个函数地址就不能提前绑定,需要在运行阶段进行绑定,地址晚绑定
void dospeak(Animal &animal) {
animal.speak();
}
//动态多态满足条件
//1.有继承关系
//2.子类重写父类的虚函数
//多态使用条件
//父类的指针或者引用指向子类对象
//重写:函数返回值类型 函数名 参数列表 完全一致称为重写
void test01() {
cat c;
dospeak(c);
}
int main() {
test01();
system("pause");
return 0;
}

多态的原理刨析

vfbtr 虚函数指针
vftable 虚函数表
当父类指针或者应用指向子类对象时 发生多态

多态案例-计算机类project9 filename02

分析利用普通写法和多态技术 设计实现两个操作数进行运算的计算器类
多态的优点
代码组织结构清晰
可读性强
利于前期和后期的扩展以及维护

include

using namespace std;
//分别利用普通写法和多态技术实现计算器
//普通写法
//class Calculator {
//public:
// int getResult(string oper) {
// if (oper == "+") {
// return m_Num1 + m_Num2;
// }
// }
// int m_Num1=10;
// int m_Num2=10;
//};
//void test02() {
// Calculator c;
// cout << c.getResult("+") << endl;
//}
class Calculator {
public:
virtual int get() {
return 0;
}
int m_A;
int m_B;
};
class Add :public Calculator {
public:
int get() {
return m_A + m_B;
}
};
void test02() {
Calculator* c = new Add;
c->m_A = 10;
c->m_B = 10;
cout << c->get() << endl;
delete c;
}
int main() {
test02();
//test02();
system("pause");
return 0;
}

纯虚函数和抽象类

在多态中 通常父类中虚函数的实现是毫无意义的 主要都是调用子类重写的内容
因此可以将虚函数改为纯虚函数
纯虚函数语法 virtual 返回值类型 函数名 (参数列表)=0;
当类中有了纯虚函数 这个类也被称为了抽像类
抽像类的特点
无法实例化对象
子类必须重写抽象类中的纯虚函数 否则也属于抽像类

多态案例二制作饮品project09 filename03

虚析构和纯虚析构project09 filename04

多态使用时 如果子类中有属性开辟到堆区 那么父类指针在释放时无法调用到子类的的析构代码
解决方式:将父类中的析构函数改为虚析构或者纯虚析构
虚析构和纯虚析构共性:
可以解决父类指针释放子类对象
都需要有具体的函数实现
虚析构和纯虚析构区别:
如果是纯虚析构,该类属于抽象类,无法实例化对象
虚析构语法:
virtual ~类名(){}
纯虚析构语法:类内声明 类外初始化
virtual ~类名(){}
类名:: ~类名(){}
有纯虚析构函数的类也属于抽象类

文件操作

通过文件可以将数据数据持久化
C++中对文件操作需要包含头文件
文件类型分为两种
文本文件-文件以文本的ASILL码形式储存在计算机中
二进制文件-文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它
操作文件三大类
ofstream:写操作
ifstream:读操作
fstream:读写操作

文本文件project09 filename05

写文件步骤
1包含头文件

include

2创建流对象
ofstream ofs;
3.打开文件
ofs.open("文件路径",打开方式);可以直接写一个文件名
4.写数据
ofs<<"写入的数据"
5.关闭文件
ofs.close();
文件打开方式:
ios::in 为读文件而打开文件
ios::out 为写文件而打开文件
ios::ate 初始文件:文件尾
ios::app 追加方式写文件
ios::trunc 如果文件存在先删除,再创建
ios::binary 二进制方式
注意 文件打开方式可以配合使用 利用|操作符
例如 用二进制方式写文件ios::binary|ios::out

include

include

include

using namespace std;
//文本文件 写文件
void test05() {
ofstream ofs;
ofs.open("test.txt", ios::out);
ofs << "张三" << endl;
ofs.close();
}
int main05() {
test05();
system("pause");
return 0;
}

文本文件-读文件project09 filename06

读文件步骤
1包含头文件

include

2创建流对象
ifstream ifs;
3.打开文件并判断文件是否打开
ifs.open("文件路径",打开方式);可以直接写一个文件名
4.读数据
四种方式读取
5.关闭文件
ifs.close();

include

include

include

using namespace std;
//文本文件 读文件
void test06() {
ifstream ifs;
//打开文件判断是否失败
ifs.open("test.txt", ios::in);
if (!ifs.is_open()) {
cout << "文件打开失败" << endl;
return;
}
//读数据
//第一种
/char buf[1024] = {};
while (ifs >> buf) {
cout << buf << endl;
}
/
//第二种
/char buf[1024] = { 0 };
while (ifs.getline(buf,sizeof(buf))){
cout << buf << endl;
}
/
//第三种
/string buf;
while (getline(ifs, buf)) {
cout << buf << endl;
}
/
//第四种
char c;
while ((c = ifs.get()) != EOF) {//EOF end of file
cout << c ;
}
ifs.close();
}
int main() {
test06();
system("pause");
return 0;
}

二进制写文件project09 filename08

以二进制的方式对文件进行读写操作
打开方式要指定为ios::binary
写文件
二进制方式写文件主要利用流对象调用成员函数write
函数原型:ostream& write(const char * buffer,int len);
参数解释:字符指针buffer指向内存中一段储存空间,len是读写的字节数

include

include

include

using namespace std;
//二进制文本文件 写文件
class Person {
public:
char m_Name[64];//最好用C语言里面的自符串命名
int m_Age;
};
void test07() {
//创建流对象打开文件
ofstream ofs("person.txt", ios::out | ios::binary);
Person p = {"张三",18};
ofs.write((const char*)&p, sizeof(p));
//ofs.open("person.txt", ios::out|ios::binary);
ofs.close();
}
int main() {
test07();
system("pause");
return 0;
}

二进制文件-读文件

二进制方式写文件主要利用流对象调用成员函数read
函数原型:istream& read(char * buffer,int len);
参数解释:字符指针buffer指向内存中一段储存空间,len是读写的字节数

include

include

include

using namespace std;

class Person {
public:
char m_Name[64]; // 使用字符数组存储姓名
int m_Age;
};

void test08() {
// 创建输入流对象打开文件 - 修复1:使用ifstream而不是ofstream
ifstream ifs("person.txt", ios::in | ios::binary); // 修复2:使用ios::in模式

if (!ifs.is_open()) {cout << "文件打开失败" << endl;return;
}// 读文件
Person p;
ifs.read((char*)&p, sizeof(Person));  // 现在可以正确调用read方法cout << "姓名: " << p.m_Name << ", 年龄: " << p.m_Age << endl;ifs.close();

}

// 添加写入文件的函数,用于创建测试数据
void writePersonFile() {
ofstream ofs("person.txt", ios::out | ios::binary);

if (!ofs.is_open()) {cout << "创建文件失败" << endl;return;
}Person p;
strcpy_s(p.m_Name, "张三");  // 安全地复制字符串
p.m_Age = 25;ofs.write((char*)&p, sizeof(Person));
ofs.close();cout << "测试文件创建成功!" << endl;

}

int main() {
// 先创建测试文件
writePersonFile();

// 然后读取文件
test08();system("pause");
return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/953682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pointnet++论文学习

背景 在PointNet中并没有局部特征的概念,要么是对单个物体进行处理获取单个特征,要么是进行整体最大池化获取全局特征,丢失了很多局部信息。也是因此在进行分割物体时效果显得一般,Pointnet++则优化了这个问题。 方…

C++的值类型(左值,右值,亡值,泛左值,纯右值)

C++的值类别C++的值的类型,基本可以分为左值,亡值,纯右值,泛左值,右值五种类型。 lvalue 平常我们说的左值就是lvalue,左值一般是指,可以在内存中长久存在的值,可以被取地址。一切具有名字的变量,不论类型如何…

CF1730D Prefixes and Suffixes

题意:给出两个字符串\(s1,s2\) 你可以把s1的k个连续前缀与s2的k个连续后缀交换 k任意选取,可以操作无限次 问是否可以将s1与s2变得相等 观察后发现,存在着某个特性,即将某一个字符串翻转之后,s1[i] == s2[i],这…

工具---短视频下载神器

在看微信视频号、小程序、抖音、快手、小红书、酷狗音乐、QQ音乐的时候,可以通过这个软件将其下载。 软件:res-downloader 在github里面下载:https://gitee.com/zhoumath/res-downloader也可以在国内的下载:https:…

使用iptables双重DNAT

使用iptables双重DNAT 一、需求 由于企业内部网络安全问题,往往只开启一个端口供企业外部业务与也企业内部服务器访问。因此需要在企业网关的前端接一个前置机(192.168.0,91),用于供端口映射处理。 整体架构如下,其…

AT ABC290 F Maximum Diameter 题解

Solution组合好题,注意到 \(n\) 个点的边数为 \(n - 1\),总度数为 \(2n - 2\),因此序列 \(a\) 的权值不为 \(0\) 时当且仅当 \(\sum a = 2n - 2\) 且 \(a_i \gt 0\)。 接下来是一个简单的贪心,如果对于给定的序列需…

ABC430

ABC430C. Truck Driver 二分或双指针 固定区间左端点 \(l\),找到区间中至少有 \(A\) 个 a 的最小右端点 \(r_a\),以及区间中至少有 \(B\) 个 \(b\) 的最小右端点 \(r_b\)。显然条件二更紧,所以用 \(r_b-r_a\) 来更…

团队作业1——团队展示选题-大学生健康生活管理与预警系统

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience/homework/13471这个作业的目标 通…

广告投放名词

直投 广告主通过广告投放平台或者Marketing API 进行广告的直接投放,利用媒体的用户数据能力以及广告模型进行广告的预估和优化。直投广告的优势在于,广告平台累计了大量的用户基础数据以及产品行为数据,得到丰富的…

自定义Linux 备份命令 backup 【from claude.ai Haiku 4.5】

自定义Linux 备份命令 backup 【from claude.ai Haiku 4.5】测试过能用在日常开发和系统维护中,我们经常需要备份文件和文件夹。虽然 cp 和 tar 命令完全可以胜任,但每次都要手动输入冗长的参数确实很麻烦。今天我就…

打造你自己的 Linux 备份命令:快速、高效、易用 【from claude.ai Haiku 4.5】

打造你自己的 Linux 备份命令:快速、高效、易用 【from claude.ai Haiku 4.5】 在日常开发和系统维护中,我们经常需要备份文件和文件夹。虽然 cp 和 tar 命令完全可以胜任,但每次都要手动输入冗长的参数确实很麻烦。…

CVE-2025-12176漏洞分析:未记录的管理账户安全风险

本文详细分析了CVE-2025-12176高危漏洞,该漏洞由于系统创建未记录的管理账户而存在安全风险。影响BLU-IC2和BLU-IC4至1.19.5版本,CVSS评分达10.0分,攻击者可远程利用此漏洞获取系统权限。概述 CVE-2025-12176是一个…

信安中级考试备忘

个人在备考的笔记,主要针对案例题Linux iptables 四表五链 私网地址A类 10.0.0.0 ~ 10.255.255.255B类 172.16.0.0 ~ 172.31.255.255C类 192.168.0.0 ~ 192.168.255.255ASCII 码记忆 A(65) a(97) 0(48) 空格(32) NUL…

pdf下载网站

pdf下载网站下载地址: 1、https://github.com/Dujltqzv/Some-Many-Books

量子力学作业 4

第 4 次作业 习题 4.5 式 \(4.25\): \[sin\theta\frac{d}{d\theta}(sin\theta\frac{d\Theta}{d\theta}) + [l(l+1)sin^2\theta-m^2]\Theta=0 \]代入 \(l=m=0\) 得: \[sin\theta\frac{d}{d\theta}(sin\theta\frac{d\T…

区间颜色类问题

即 RMQ问题(对长度为n的数列快速响应多个区间极值查询) 中的统计颜色 在此类问题中最重要的是记录:所有颜色上一次出现的位置,然后通过维护使得每种颜色只记录一次 P1972 [SDOI2009] HH 的项链 P4137 Rmq Problem / …

【URP】Unity[后处理]色彩调整ColorAdjustments

Unity URP中的Color Adjustments后处理效果用于调整最终渲染图像的整体色调、亮度和对比度,是优化视觉表现的核心工具。其发展历史可追溯至Unity 4.X时代的色彩校正曲线和3D查【从UnityURP开始探索游戏渲染】专栏-直达…

[LangChain] Runnable接口 - 1

在 LCEL 中,几乎所有的模块:提示词模板 模型 解析器都是实现了 Runnable 接口的,可以将这些模块称之为 Runnable 类型。这种类型的模块可以快速插入到链条里面。 RunnableLambda RunnableLambda 是 LangChain.js 提…

MySQL 巡检用户创建脚本(Python 版)

MySQL 巡检用户创建脚本(Python 版)脚本依赖 需先安装 MySQL 官方 Python 连接器,执行以下命令安装: pip install mysql-connector-python完整 Python 脚本 import os import getpass import mysql.connector from…

初识目标检测

一.目前我校主要研究方向就是目标检测,所以首先应对目标检测有初步了解。目标检测属于计算机视觉中的一个热门方向,主要应用于物体、人、动物识别、动作识别等。结合我校农业研究方向,通过目标检测,可以用来检测瓜…