C++之模板类如何继承类实例?(二百五十八)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:在Android车载系统代码中,发现模板类继承类实例的例子,分享给大家。

2.C++模板类介绍

  • C++模板类是C++编程语言中一种特殊类型的类,它允许程序员编写可重用的代码,同时保持类型安全和灵活性。模板类是一种泛型编程的工具,它可以创建通用的类,能够处理各种数据类型。
    模板类的核心思想是参数化类型。在定义模板类时,程序员使用一个或多个类型参数来代替具体的类型。这些类型参数在实例化模板类时由具体的类型替代,从而使得模板类能够适用于不同的数据类型。
    模板类的定义和使用有以下几个步骤:
  1. 定义模板类:在类名后面加上模板参数,通常是一个或多个类型参数。例如,定义一个模板类模板 class MyClass {…};
  2. 实例化模板类:在使用模板类时,需要指定具体的类型来实例化模板类。例如,声明一个MyClass类型的对象myObject,并指定类型为int myObject = MyClass();
    模板类具有以下特点:
  3. 类型安全:模板类通过类型检查确保实例化的对象是正确的类型。这有助于减少编程错误并提高代码的可靠性。
  4. 代码重用:模板类可以重用相同的代码结构,同时处理不同的数据类型。这有助于减少代码冗余并提高开发效率。
  5. 灵活性:模板类可以处理用户定义的类型,如类和结构体,而不仅仅是内置类型。这使得模板类在处理复杂数据结构时更加灵活。
  6. 性能:模板类在编译时生成特定的代码,因此在运行时具有较好的性能。与使用宏定义相比,模板类避免了重复的编译过程,提高了编译效率。
    然而,模板类也存在一些缺点:
  7. 编译复杂性:模板类会增加编译的复杂性,因为编译器需要处理类型参数的替换和代码生成。这可能导致编译时间变长。
  8. 学习曲线:模板类的学习曲线较陡峭,初学者可能需要一定的时间来理解和掌握模板类的使用。
    总之,C++模板类是一种强大的工具,它提供了类型安全和代码重用的同时,还具有灵活性和性能优势。通过使用模板类,程序员可以编写更加通用和可维护的代码。

3.代码实例

V1.0

#include <iostream>
#include <memory>//1.VehicleHalClient类
class VehicleHalClient {
public:virtual ~VehicleHalClient() = default;virtual void work() = 0;
};//2.模板类:IPassThroughConnector
template <typename VehicleClientType>
class IPassThroughConnector : public VehicleClientType {//模板类继承自VehicleClientType,实际传入的VehicleHalClient类.};//2.DefaultVehicleConnector继承自模板类IPassThroughConnector
class DefaultVehicleConnector : public IPassThroughConnector<VehicleHalClient> {void work(){printf("xxx----------->%s(), line = %d\n",__FUNCTION__,__LINE__);}
};//3.DefaultVehicleHal类
class DefaultVehicleHal {
public:DefaultVehicleHal(VehicleHalClient* client) : client_(client) {printf("xxx----------->%s(), line = %d\n",__FUNCTION__,__LINE__);client_->work();}private:VehicleHalClient* client_;
};int main() {auto connector = std::make_unique<DefaultVehicleConnector>();auto hal = std::make_unique<DefaultVehicleHal>(connector.get());return 0;
}

V2.0

#include <iostream>
#include <memory>//1.VehicleHalClient类
class VehicleHalClient {
public:virtual ~VehicleHalClient() = default;virtual void work() = 0;
};//2.模板类:IPassThroughConnector
template <typename VehicleClientType>
class IPassThroughConnector : public VehicleClientType {//模板类继承自VehicleClientType,实际传入的VehicleHalClient类.};//2.DefaultVehicleConnector继承自模板类IPassThroughConnector
class DefaultVehicleConnector : public IPassThroughConnector<VehicleHalClient> {void work(){printf("xxx----------->%s(), line = %d\n",__FUNCTION__,__LINE__);}
};//3.DefaultVehicleHal类
class DefaultVehicleHal {
public:DefaultVehicleHal(VehicleHalClient* client) : client_(client) {printf("xxx----------->%s(), line = %d\n",__FUNCTION__,__LINE__);client_->work();}private:VehicleHalClient* client_;
};int main() {std::unique_ptr<DefaultVehicleConnector> connector = std::make_unique<DefaultVehicleConnector>();std::unique_ptr<DefaultVehicleHal> hal = std::make_unique<DefaultVehicleHal>(connector.get()); return 0;
}

V3.0

#include <iostream>
#include <memory>//1.VehicleHalClient类
class VehicleHalClient {
public:virtual ~VehicleHalClient() = default;virtual void work() = 0;
};//2.模板类:IPassThroughConnector
template <typename VehicleClientType>
class IPassThroughConnector : public VehicleClientType {//模板类继承自VehicleClientType,实际传入的VehicleHalClient类.};//2.DefaultVehicleConnector继承自模板类IPassThroughConnector
class DefaultVehicleConnector : public IPassThroughConnector<VehicleHalClient> {void work(){printf("xxx----------->%s(), line = %d\n",__FUNCTION__,__LINE__);}
};//3.DefaultVehicleHal类
class DefaultVehicleHal {
public:DefaultVehicleHal(VehicleHalClient* client) : client_(client) {printf("xxx----------->%s(), line = %d\n",__FUNCTION__,__LINE__);client_->work();}private:VehicleHalClient* client_;
};int main() {std::unique_ptr<DefaultVehicleConnector> connector(new DefaultVehicleConnector());std::unique_ptr<DefaultVehicleHal> hal = std::make_unique<DefaultVehicleHal>(connector.get());return 0;
}
1.hal和hal.get()区别

hal:表示智能指针的类型
hal.get():表示DefaultVehicleHal原始指针类型.

2.DefaultVehicleConnector为什么可以转换VehicleHalClient?
1.DefaultVehicleConnector是从IPassThroughConnector<VehicleHalClient> 公开派生.
2.IPassThroughConnector<VehicleHalClient>又从VehicleHalClient公开派生.
3.DefaultVehicleConnector的对象可以隐式地转换为VehicleHalClient类型的指针。

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

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

相关文章

WordPress主题YIA在广告位添加图片广告时下方有空白怎么办?

YIA主题设置中默认有4个广告位&#xff0c;而侧边栏的广告位由站长自行添加。boke112百科在这些广告位添加图片广告后发现图片下方有空白&#xff0c;导致下方的两个角没有变圆角&#xff0c;看起来也有点不好看。具体如下图所示&#xff1a; 其实&#xff0c;这个问题就是典型…

一周学会Django5 Python Web开发-项目配置settings.py文件-其他配置

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计17条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

P2024 [NOI2001] 食物链 带权并查集 循环关系

题目&#xff1a; P2024 [NOI2001] 食物链 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 本文学习自&#xff1a; 题解 P2024 【食物链】 - RE: 从零开始的异世界信竞生活 - 洛谷博客 (luogu.com.cn) ———— 关系并查集其实就是在普通并查集的基础上额外开个数组r…

【Python---六大数据结构】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; Python---六大数据结构 往期内容前言概述一下可变与不可变 Number四种不同的数值类型Number类型的创建i…

深入解析鸿蒙系统的页面路由(Router)机制

鸿蒙系统以其独特的分布式架构和跨设备的统一体验而备受瞩目。在这个系统中&#xff0c;页面路由&#xff08;Router&#xff09;机制是连接应用各页面的关键组成部分。本文将深入探讨鸿蒙系统的页面路由&#xff0c;揭示其工作原理、特点以及在应用开发中的实际应用。 1. 实现…

OpenHarmony系统解决方案 - 配置屏幕方向导致开机动画和Launcher显示异常

问题环境 系统版本&#xff1a;OpenHarmony-3.2-Release 问题现象 配置设备默认方向&#xff0c;例如修改为横屏显示&#xff0c;修改文件display_manager_config.xml的buildInDefaultOrientation参数值为2(Orientation::HORIZONTAL)。 源码中文件位于foundation/window/win…

适用于电脑和手机的照片恢复工具指南

这是适用于 Android、iPhone、Mac 和 Windows 的最佳照片恢复应用程序的指南。 如果您不小心删除了一堆珍贵的照片&#xff0c;请不要担心&#xff01; 恢复丢失的照片和数据实际上比您想象的要容易得多。 通过使用照片恢复应用程序&#xff0c;您可以“解锁”存储卡或硬盘驱…

php基础学习之文件包含

描述 在一个php脚本中&#xff0c;将另一个php文件包含进来&#xff0c;合作实现某种功能 这个描述看起来似乎和C/Java等语言的头文件/包有点类似&#xff0c;但本质是不一样的 打个比方&#xff1a; C/Java的头文件/包更像是一个工具箱&#xff0c;存放各种很完善的工具&#…

LabVIEW开发DUP实时监控系统

LabVIEW开发DUP实时监控系统 该项目采用虚拟仪器设计理念&#xff0c;以LabVIEW作为核心技术平台&#xff0c;开发了一套磁控溅射过程的实时监控系统。实现过程中关键参数的全面数据采集与处理&#xff0c;建立完整的历史数据库&#xff0c;以支持涂层技术的改进和系统向模糊控…

Leetcode1423.可获得的最大点数

文章目录 题目原题链接思路&#xff08;逆向思维&#xff09; 题目 原题链接 Leetcode1423.可获得的最大点数 思路&#xff08;逆向思维&#xff09; 由题目可知&#xff0c;从两侧选k张&#xff0c;总数为n张&#xff0c;即从中间选n - k张 nums总和固定&#xff0c;要选k张最…

RK3399平台开发系列讲解(调试篇)死锁检测工具lockdep

🚀返回专栏总目录 文章目录 一、常见死锁场景二、lockdep使用方法三、lockdep技术原理3.1、锁类状态3.2、检查规则沉淀、分享、成长,让自己和他人都能有所收获!😄 📢介绍死锁检测工具lockdep。 资料 一、常见死锁场景 场景1:进程重复申请同一个锁,称为AA死锁。例如…

深入理解lambda表达式

深入理解ASP.NET Core中的中间件和Lambda表达式 var builder WebApplication.CreateBuilder(args); var app builder.Build(); app.Use(async (context, next) > { // Add code before request. await next(context);// Add code after request.}); 这段C#代码是用于设…