c++ 模板和对象多态的结合情况举例

news/2024/9/23 4:23:29/

1.概要

模板和对象多态的结合情况举例

模板多态的碰撞会擦出什么样的火花呢?
模板是忽略类型,啥意思,就是一个函数,来一个模板的对象,无论啥对象,我都按照一个套路处理。
多态呢,多态是根据对象不同有不同的行为,就是调用一个函数,会因对象不同有不同的行为。

他们俩的具体差别其实,可以这样理解,泛型是作为函数的参数来处理的,而多态多态是因对象不同选择不同的函数的。多态是根据一个对象的处理,无论啥对象我都按照一个套路来,多态呢,同一个函数因对象的不同会有不同的行为。
泛型像这样 函数(泛型)
多态像这样 对象->函数()
其实把多态弄得在本质点是这样 对象->函数()=>函数(多态对象)
其实我们看到的是对象调用函数,本质上是函数引入了一个默认的zhis指针,所有的面向对象函数都有这样的一个指针;
函数的本质并没有变,如果你看到内存内部的函数多态的函数是完全名称不同函数,且每个函数都必有一个指向对象的参数。
所以模板多态的结合就是,模板的处理套路是相同的,但只这个相同处理中因模板本身对象的多态会调用不同的函数有多态的行为,所以模板多态的结合就是一个既把共性集中,又把个性独立的一种结合,高度依赖共性,又保持个性。可以把高内聚(模板),低耦合(多态)做到一个极致。

模板呢,是按照一个套路处理无论啥对象,那么按照一定的套路处理,就要求这个对象一定也有些共性。比如相加那就要求所有都行都能支持这个运算符,比如对吧,就比如好多和排序相关的容器,就必须要求对象支持对比。所以模板虽然是对所有的对象都执行一样的处理,但是对对象也是又要求的,首先对象得支持这些处理。这些处理又聚友多态的特点,那就是多态为这个泛型的处理提供的个性。

在C++中,模板和对象多态性的结合使用可以带来很大的灵活性。模板允许我们编写与类型无关的代码,而多态性则允许我们使用基类的指针或引用来操作派生类的对象。当我们将这两者结合时,可以编写出既类型无关又具有多态性的代码。

2.代码

#include <iostream>  
#include <vector>  
#include <memory>  // 定义一个基类 Animal  
class Animal {  
public:  virtual ~Animal() {}  virtual void speak() const = 0;  
};  // 定义派生类 Dog 和 Cat,继承自 Animal  
class Dog : public Animal {  
public:  void speak() const override {  std::cout << "Woof!" << std::endl;  }  
};  class Cat : public Animal {  
public:  void speak() const override {  std::cout << "Meow!" << std::endl;  }  
};  // 定义一个模板类,用于存储和管理 Animal 对象的指针  
template <typename T>  
class AnimalShelter {  
private:  std::vector<std::unique_ptr<Animal>> animals;  
public:  void adopt(std::unique_ptr<T> animal) {  animals.push_back(std::move(animal));  }  void letThemSpeak() const {  for (const auto& animal : animals) {  animal->speak(); // 多态性:使用基类的指针调用派生类的 speak 方法  }  }  
};  int main() {  // 创建 AnimalShelter 对象,存储 Dog 和 Cat 对象  AnimalShelter<Animal> shelter;  shelter.adopt(std::make_unique<Dog>());  shelter.adopt(std::make_unique<Cat>());  // 让动物们“说话”  shelter.letThemSpeak(); // 输出: Woof! Meow!  return 0;  
}

3.运行结果

Woof!
Meow!

4.备注

在这个例子中:

我们首先定义了一个基类 Animal,它有一个纯虚函数 speak()。
然后定义了两个派生类 Dog 和 Cat,它们分别实现了 speak() 函数,以模拟狗和猫的叫声。
接着,我们定义了一个模板类 AnimalShelter,它用于存储和管理 Animal 对象的指针(实际上是 std::unique_ptr<Animal> 的智能指针)。这个类有一个 adopt 方法用于添加动物,以及一个 letThemSpeak 方法用于让所有的动物“说话”。
在 letThemSpeak 方法中,我们遍历存储的动物指针,并通过基类指针调用 speak() 方法。由于 speak() 是虚函数,因此实际调用的是相应派生类实现的版本,这体现了多态性。
在 main 函数中,我们创建了一个 AnimalShelter 对象,并向其中添加了一个 Dog 对象和一个 Cat 对象。然后调用 letThemSpeak 方法,结果会输出 Woof! 和 Meow!,分别表示狗和猫的叫声。
这个例子展示了模板如何与多态性结合使用。AnimalShelter 是一个模板类,它可以接受任何从 Animal 派生出来的类型,并利用多态性来统一处理这些类型。这种结合使得代码既类型无关又具有灵活性,可以轻松地扩展以支持更多的动物类型。


http://www.ppmy.cn/news/1436117.html

相关文章

Java Web 网页设计(1)

不要让追求之舟停泊在幻想的港湾 而应扬起奋斗的风帆 驶向现实生活的大海 网页设计 1.首先 添加框架支持 找到目录右键添加 找到Web Application选中 点击OK 然后 编辑设置 找到Tomcat--local 选中 点击OK 名称可以自己设置 找到对应文件夹路径 把Tomcat添加到项目里面 因为…

详解 C++ 实现K-means算法

一、K-means算法概述 K-means算法是一种非常经典的聚类算法&#xff0c;其主要目的是将数据点划分为K个集群&#xff0c;以使得每个数据点与其所属集群的中心点&#xff08;质心&#xff09;的平方距离之和最小。这种算法在数据挖掘、图像处理、模式识别等领域有着广泛的应用。…

IDEA中Vue开发环境搭建

1. IDEA安装Vue.js 文件>设置>插件>搜索Vue.js并安装。 2. 安装Node.js 官网地址&#xff1a;https://nodejs.org 安装包下载地址&#xff1a;https://nodejs.org/en/download 下载并安装&#xff0c;安装时&#xff0c;勾选添加系统变量选项。 # 如果正确安装…

基于AI的pdf转word方法

依赖包 Supported versions/Pre-requisites. Python3.63.73.8Python Packages Google TesseractA Python wrapper for Google TesseracttqdmPillowpdf2imagepython-docxInstallation: pip install

Ubuntu 22最新dockers部署redis哨兵模式,并整合spring boot和配置redisson详细记录(含spring boot项目包)

dockers部署redis哨兵模式&#xff0c;并整合spring boot 环境说明相关学习博客一、在docker中安装redis1、下载dockers镜像包和redis配置文件&#xff08;主从一样&#xff09;2、编辑配置文件3、启动redis&#xff08;主从一样&#xff09;4、进入容器测试&#xff08;主从一…

富格林:曝光正确摆脱欺诈方略

富格林悉知&#xff0c;随着金融市场的不断发展&#xff0c;被曝光的现货黄金投资作为一种相对稳健的投资方式&#xff0c;受到了越来越多投资者的青睐。然而&#xff0c;对于许多初入市场的投资者来说&#xff0c;如何正确摆脱欺诈陷阱&#xff0c;以及投资过程中需要注意哪些…

Linux中V4L2使用

Video for Linuxtwo(Video4Linux2)简称V4L2&#xff0c;是V4L的改进版。V4L2是linux操作系统下用于采集图片、视频和音频数据的API接口&#xff0c;配合适当的视频采集设备和相应的驱动程序&#xff0c;可以实现图片、视频、音频等的采集。在远程会议、可视电话、视频监控系统和…

Ubuntu22.04.4 - apt - 笔记

一、修改源配置 这里使用的时候又出现了联不通的情况&#xff0c;换成国内镜像 在update cp /etc/apt/source.list /etc/apt/source.list.bak vim source.list 换源地址 修改完&#xff08;网上有&#xff0c;注意&#xff1a;根据Ubuntu版本不一样&#xff0c;部分内同也会不…