如何理解多态,以及由此引出的抽象类和纯虚函数

embedded/2025/2/7 7:14:47/

文章目录

    • 1. 多态
    • 2. 抽象类和纯虚函数

1. 多态

静态多态:
在这里插入图片描述

动态多态:
在这里插入图片描述

#include <iostream>
#include <string>
using namespace std;// 动物的基类
class Animal {
public:Animal(string name) : _name(name) {}virtual void bark() {}
protected:string _name;
};// 动物的实体类
class Cat : public Animal {
public:Cat(string name) : Animal(name) {}void bark() { cout << _name << "bark: miao miao!" << endl; }
private:int mb;
};class Dog : public Animal {
public:Dog(string name) : Animal(name) {}void bark() { cout << _name << "bark: wang wang!" << endl; }
private:int mb;
};class Pig : public Animal {
public:Pig(string name) : Animal(name) {}void bark() { cout << _name << "bark: heng heng!" << endl; }
private:int mb;
};/*
* 下面的一组bark API接口无法做到我们软件设计要求的“开-闭”原则
* 软件设计由六大原则 “开-闭”原则 对修改关闭,对扩展开放
*/
//void bark(Cat &cat) {
//	cat.bark();
//}
//void bark(Dog &dog) {
//	dog.bark();
//}
//void bark(Pig &pig) {
//	pig.bark();
//}void bark(Animal *p) {p->bark();//Animal::bark虚函数,动态绑定了/*p->cat Cat vftable &Cat::barkp->dog Dog vftable &Dog::barkp->pig Pig vftable &Pig::bark*/
}int main() {Cat cat("猫咪");Dog dog("二哈");Pig pig("佩奇");//bark(cat);//bark(dog);//bark(pig);bark(&cat);bark(&dog);bark(&pig);return 0;
}

2. 抽象类和纯虚函数

抽象类和普通类有什么区别?

一般把什么类设计成抽象类? 基类
动物的基类 泛指 类 -> 抽象一个实体的类型

定义Animal的初衷,并不是让Animal抽象某个实体的类型

  1. string _name; 让所有的动物实体类通过继承Animal直接复用该属性
  2. 给所有的派生类保留统一的覆盖/重写接口

拥有纯虚函数的类,叫做抽象类!(Animal)
Animal a; No!!!
抽象类不能再实例化对象了,但是可以定义指针和引用变量。

#include <iostream>
#include <string>
using namespace std;// 汽车的基类
class Car {// 抽象类
public:Car(string name, double oil) : _name(name), oil(oil) {}// 获取汽车剩余油量还能跑的公里数double getLeftMiles() {// 1L 10 * oilreturn oil * this->getMilesPerGallon();// 发生动态绑定了}string getName() const { return _name; }
protected:string _name;double oil;virtual double getMilesPerGallon() = 0;// 纯虚函数
};class Bnze : public Car {
public:Bnze(string name, double oil) : Car(name, oil) {}double getMilesPerGallon() { return 20.0; }
};class Audi : public Car {
public:Audi(string name, double oil) : Car(name, oil) {}double getMilesPerGallon() { return 18.0; }
};class BMW : public Car {
public:BMW(string name, double oil) : Car(name, oil) {}double getMilesPerGallon() { return 19.0; }
};// 给外部提供一个同一的获取汽车剩余路程数的API
void showCarLeftMiles(Car &car) {cout << car.getName() << "left miles:" << car.getLeftMiles() << "公里" << endl; // 静态绑定 call Car::getLeftMiles()
}int main() {Bnze bl("奔驰", 20.0);Audi a("奥迪", 20.0);BMW b2("宝马", 20.0);showCarLeftMiles(bl);showCarLeftMiles(a);showCarLeftMiles(b2);/*奔驰left miles:400公里奥迪left miles:360公里宝马left miles:380公里*/return 0;
}

http://www.ppmy.cn/embedded/160227.html

相关文章

FinRobot:一个使用大型语言模型的金融应用开源AI代理平台

“FinRobot: An Open-Source AI Agent Platform for Financial Applications using Large Language Models” 论文地址&#xff1a;https://arxiv.org/pdf/2405.14767 Github地址&#xff1a;https://github.com/AI4Finance-Foundation/FinRobot 摘要 在金融领域与AI社区间&a…

基于springboot+vue的青少年心理健康教育网站的设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

DeepSeek 遭 DDoS 攻击背后:DDoS 攻击的 “千层套路” 与安全防御 “金钟罩”

当算力博弈升级为网络战争&#xff1a;拆解DDoS攻击背后的技术攻防战——从DeepSeek遇袭看全球网络安全新趋势 在数字化浪潮席卷全球的当下&#xff0c;网络已然成为人类社会运转的关键基础设施&#xff0c;深刻融入经济、生活、政务等各个领域。从金融交易的实时清算&#xf…

对比DeepSeek、ChatGPT和Kimi的学术写作撰写引言能力

引言 引言部分引入研究主题&#xff0c;明确研究背景、问题陈述&#xff0c;并提出研究的目的和重要性&#xff0c;最后&#xff0c;概述研究方法和论文结构。 下面我们使用DeepSeek、ChatGPT4以及Kimi辅助引言撰写。 提示词&#xff1a; 你现在是一名[计算机理论专家]&#…

11. 9 构建生产级聊天对话记忆系统:从架构设计到性能优化的全链路指南

构建生产级聊天对话记忆系统:从架构设计到性能优化的全链路指南 关键词: 聊天对话记忆系统、多用户会话管理、LangChain生产部署、Redis记忆存储、高并发对话系统 一、服务级聊天记忆系统核心需求 多用户隔离:支持同时处理数千个独立对话持久化存储:对话历史不因服务重启丢…

(2025,推理语言模型 / RLM,deepseek-v3,推理结构,推理策略,强化学习概念,监督学习方法,计算优化技术)

Reasoning Language Models: A Blueprint 目录 1. 引言 2. 主要贡献 3. RLMs 的基本架构 3.1 RLMs 发展的三大支柱 3.2 RLMs 推理能力的核心特性 4. RLMs 设计蓝图 4.1 推理结构 4.2 推理策略 4.3 操作算子&#xff08;Operators&#xff09; 4.4 训练方法 4.5 训练…

20250206在ubuntu20.04下使用unzip解压缩带中文名的文件

unzip -O GBK yourfile.zip unzip -O CP936 xxx.zip unar xxx.zip 20250206在ubuntu20.04下使用unzip解压缩带中文名的文件 2025/2/6 20:03 缘起&#xff1a;有些ZIP文件&#xff0c;里面有中文文件名。在WINDOWS系统中解压缩正常。 但是在Ubuntu20.04下可以解压缩&#xff0c;…

数据库并发策略

并发控制是数据库管理中的一个重要方面&#xff0c;它确保多个事务能够正确地访问和修改数据&#xff0c;同时保持数据的一致性和完整性。乐观锁、悲观锁和时间戳是并发控制的三种主要方法。以下是对这三种方法的详细解析&#xff0c;并结合实践进行分析&#xff1a; 一、乐观…