当前位置: 首页 > news >正文

C++类与对象--7 特性三:多态

7.1 多态的实现

(1)静态多态

  • 函数重载运算符重载
  • 编译阶段确定函数地址

(2)动态多态

  • 派生类(继承关系)虚函数(派生类重写)实现动态多态
  • 运行阶段确定函数地址
  • 使用:父类的引用指针指向子类对象
class Animal
{
public:virtual void speek() // 虚函数{ std::cout << "dongwu speek." << std::endl; }
};
​
class Cat:public Animal
{
public:void speek() // 对父类虚函数的重写{ std::cout << "cat speek." << std::endl; }
};
​
class Dog:public Animal
{
public:void speek() // 对父类虚函数的重写{ std::cout << "dog speek." << std::endl; }
};
​
void doSpesk(Animal & animal) // 父类的引用作为函数形参
{ animal.speek(); }
​
int main()
{Cat cat;doSpesk(cat); // 父类的引用指向子类的对象Dog dog;doSpesk(dog); // 父类的引用指向子类的对象
​return 0;
}

7.2 多态的底层原理

class Animal
{
public:virtual void speek() // 虚函数{ std::cout << "dongwu speek." << std::endl; }
};
  • Animal类内部speek函数不加virtual时,Animal类大小为1字节(空对象)
  • Animal类内部speek函数加virtual后,Animal类大小为3字节(多了一个虚拟函数指针vfptr)

7.3 纯虚函数和抽象类

  • 多态中,父类中实现的虚函数不会被使用,主要使用的是子类中重写的函数
  • 将父类中的虚函数写成纯虚函数,父类变成抽象类
  • 抽象类特点如下:
  1. 不能实例化对象
  2. 子类必须重写纯虚函数,否则子类也自动变成抽象类
class Base
{ virtual void func() = 0; // 纯虚函数语法
};
​
class Son:public Base
{void func(){}}; // 子类重写纯虚函数
​
int main()
{Base * son = new Son; // 父类指针指向子类,实现多态son->func();
}

7.4 虚析构和纯虚析构

  • 多态中,子类如果开辟了堆区内存,父类指针将无法调用到子类析构函数去释放堆区内存
  • 虚析构函数纯虚析构函数可以解决上述问题
  • 虚析构函数和纯虚析构函数除了声明,还需要定义(用于父类堆区数据释放)
  • 声明纯虚析构函数的类,变成抽象类
class Base
{
public:virtual ~Base() = 0; // 纯虚析构的声明
};
​
Base::~Base(){} // 纯虚析构的定义实现(必须有,用于堆区数据释放)
​
class Son:public Base
{
public:Son(int val){m_val = new int(val);} // 堆区分配内存~Son(){if(m_val != NULL){delete m_val;m_val = NULL;}}int * m_val;
};
​
int main()
{Base * son = new Son(10); // 父类指针指向子类对象delete son; // 调用子类析构函数释放堆区内存system("pause");return 0;
}

http://www.xdnf.cn/news/548767.html

相关文章:

  • # YOLOv5:目标检测的新里程碑
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(25):受身形(3)
  • GitHub 自动认证教程
  • cv2.VideoWriter_fourcc(*‘mp4v‘)生成的视频无法在浏览器展
  • Fast Video Cutter Joiner v6.8.2 视频剪切合并器汉化版
  • 第10天-Python操作MySQL数据库全攻略:从基础连接到高级应用
  • 云计算与大数据进阶 | 27、存储系统如何突破容量天花板?可扩展架构的核心技术与实践—— 分布式、弹性扩展、高可用的底层逻辑(上)
  • 第7天-Python+PyEcharts实现股票分时图实战教程
  • workflow:高效的流式工作架构
  • BPMN.js编辑器设计器与属性面板数据交互
  • 【动手学深度学习】系列
  • 【AI News | 20250520】每日AI进展
  • 5.20 note
  • 什么是 AI 人工智能?什么是机器学习?什么是深度学习?三者啥关系
  • 基于AutoDL市场下的Pycharm远程控制
  • Redis从入门到实战 - 高级篇(中)
  • Jedis快速入门【springboot】
  • NMOS和PMOS的区别
  • 大语言模型 14 - Manus 超强智能体 开源版本 OpenManus 上手指南
  • 从混乱到高效:我们是如何重构 iOS 上架流程的(含 Appuploader实践)
  • 南柯电子|储能EMC整改:从单点整改到智能预测的进化路径
  • 瑞萨单片机笔记
  • #渗透测试#批量漏洞挖掘#LiveBos UploadFile(CVE-2021-77663-2336) 任意文件上传漏洞
  • Translational Psychiatry | 注意缺陷多动障碍儿童延迟厌恶的行为与神经功能特征茗创科技茗创科技
  • MySQL与Redis一致性问题分析
  • 数据库与存储安全
  • DeepSeek在政务与公共服务中的智能化实践
  • 中国国际软件发展大会荣誉揭晓,远光九天 AI 应用开发平台获评“软件行业突破性技术成果”
  • 多模态实时交互边界的高效语音语言模型 VITA-Audio 介绍
  • 全球氰化物测定仪市场:现状、趋势与展望