简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:在Android车载系统代码中,发现模板类继承类实例的例子,分享给大家。
2.C++模板类介绍
- C++模板类是C++编程语言中一种特殊类型的类,它允许程序员编写可重用的代码,同时保持类型安全和灵活性。模板类是一种泛型编程的工具,它可以创建通用的类,能够处理各种数据类型。
模板类的核心思想是参数化类型。在定义模板类时,程序员使用一个或多个类型参数来代替具体的类型。这些类型参数在实例化模板类时由具体的类型替代,从而使得模板类能够适用于不同的数据类型。
模板类的定义和使用有以下几个步骤:
- 定义模板类:在类名后面加上模板参数,通常是一个或多个类型参数。例如,定义一个模板类模板 class MyClass {…};
- 实例化模板类:在使用模板类时,需要指定具体的类型来实例化模板类。例如,声明一个MyClass类型的对象myObject,并指定类型为int myObject = MyClass();
模板类具有以下特点: - 类型安全:模板类通过类型检查确保实例化的对象是正确的类型。这有助于减少编程错误并提高代码的可靠性。
- 代码重用:模板类可以重用相同的代码结构,同时处理不同的数据类型。这有助于减少代码冗余并提高开发效率。
- 灵活性:模板类可以处理用户定义的类型,如类和结构体,而不仅仅是内置类型。这使得模板类在处理复杂数据结构时更加灵活。
- 性能:模板类在编译时生成特定的代码,因此在运行时具有较好的性能。与使用宏定义相比,模板类避免了重复的编译过程,提高了编译效率。
然而,模板类也存在一些缺点: - 编译复杂性:模板类会增加编译的复杂性,因为编译器需要处理类型参数的替换和代码生成。这可能导致编译时间变长。
- 学习曲线:模板类的学习曲线较陡峭,初学者可能需要一定的时间来理解和掌握模板类的使用。
总之,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类型的指针。