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

C++学习寄录(九.多态)

1.多态基本概念

先来看这样的代码,我的本意是想要输出“小猫在说话”,但实际输出的却是“动物在说话”。这是因为地址早绑定,在代码编译阶段就已经确定了函数地址;如果想要实现既定目标,那么这个dospeak()函数就不能提前绑定,需要在运行阶段进行绑定,也就是地址晚绑定。

#include <iostream>
#include <fstream>
#include <string>
#include <chrono>
#include <ctime>
#include <thread>using namespace std;class animal{public:void speak(){std::cout << "动物在说话" << std::endl;}
};class cat : public animal{public:void speak(){std::cout << "小猫在说话" << std::endl;}
};void dospeak(animal &animal){animal.speak();
}int main(){cat cat1;dospeak(cat1);return 0;
}

输出为

动物在说话

把父类的函数定义为虚函数,这样这个函数的地址就不是早绑定,他需要在代码运行时确定传入的对象,再来确定地址,这样便完成了地址晚绑定。

#include <iostream>
#include <fstream>
#include <string>
#include <chrono>
#include <ctime>
#include <thread>using namespace std;class animal{public:virtual void speak(){std::cout << "动物在说话" << std::endl;}
};class cat : public animal{public:void speak(){std::cout << "小猫在说话" << std::endl;}
};void dospeak(animal &animal){animal.speak();
}int main(){cat cat1;dospeak(cat1);return 0;
}

输出为

小猫在说话

这样就叫做多态,多态满足条件

* 有继承关系

* 子类重写父类中的虚函数

多态使用条件

* 父类指针或引用指向子类对象

重写:函数返回值类型 函数名 参数列表 完全一致称为重写

2.纯虚函数和抽象类

在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容

因此可以将虚函数改为**纯虚函数**

纯虚函数语法:`virtual 返回值类型 函数名 (参数列表)= 0 ;`

当类中有了纯虚函数,这个类也称为==抽象类==

**抽象类特点**:

* 无法实例化对象

* 子类必须重写抽象类中的纯虚函数,否则也属于抽象类

#include <iostream>
#include <fstream>
#include <string>
#include <chrono>
#include <ctime>
#include <thread>using namespace std;class Animal
{
public://纯虚函数//类中只要有一个纯虚函数就称为抽象类//抽象类无法实例化对象//子类必须重写父类中的纯虚函数,否则也属于抽象类virtual void func() = 0;
};class Cat :public Animal
{
public:Cat(string name){name_t = new string(name);}virtual void func() {cout << *name_t << "小猫在说话" << endl;	   //子类必须重写父类中的纯虚函数,否则也属于抽象类};string *name_t;
};int main() {Animal *animal = new Cat("Tom");    // 抽象类无法实例化对象animal->func();delete animal;   //记得销毁return 0;
}

输出为

Tom小猫在说话

http://www.lryc.cn/news/254789.html

相关文章:

  • 【Linux基础开发工具】yum生态vim的配置与使用
  • java-HashMap、TreeMap、LinkedHashMap、ArrayList、LinkedList使用笔记
  • Oracle中mybatis批量更新报错ORA-00933:SQL命令未正确结束
  • Mysql综合案例练习<1>
  • Linux系统编程:线程总结
  • activemq启动成功但web管理页面却无法访问
  • 【Flink on k8s】- 0 - Flink kubernetes operator 快速入门与实战
  • 毕设:《基于hive的音乐数据分析系统的设计与实现》
  • PHP使用HTTP代码示例模板
  • 头歌题目-数组
  • C++ vector基本操作
  • 使用SLS日志服务采集Kong网关的日志
  • TA-Lib学习研究笔记(九)——Pattern Recognition (1)
  • 基于GAN的多尺度门合并多模态MRI图像合成
  • 浅谈https
  • 计算两个结构的差
  • class037 二叉树高频题目-下-不含树型dp【算法】
  • 使用cpolar完成内网穿刺
  • git的使用:基础配置和命令行
  • 若依微服务项目整合rocketMq
  • 连接服务器的ssh终端自动断开解放方法
  • Windows+WSL开发环境下微服务注册(Consul)指定IP
  • 通过K8S安装人大金仓数据库
  • 正则表达式(3):入门
  • 《系统架构设计师教程(第2版)》第2章-计算机系统基础知识-01-计算机硬件
  • 用友NC word.docx接口存在任意文件读取漏洞
  • 【离散数学】——期末刷题题库(等价关系与划分)
  • IDEA maven无法下载源代码处理
  • 基于B/S架构的医院一体化电子病历编辑器源码
  • 免费百度SEO优化工具,百度SEO优化排名工具