C++(12) 模板類、模板繼承(嚴格模式和自由模式)

文章目錄

      • 模版類
        • 1. 模版類
        • 2. 模版參數限制
        • 3. 模版繼承
          • 3.1 嚴格模式
          • 3.2 自由模式
        • 4. 模版類的模版函數
        • 5. 返回值類型帶有模版

模版類

1. 模版類
#include <iostream>using namespace std;/*
當前 Person 類型,聲明了連個模版分別對應NameType 模版類型,名稱可以看出,用于約束成員變量 name 的類型AgeType  模版類型,名稱可以看出,用于約束成員變量 age 的類型模版類型充當數據類型占位符,在整個類中,成員變量,成員函數,構造函數都可以使用
*/
template <typename NameType, typename AgeType>
class Person
{
public:Person() {}Person(NameType name, AgeType age) : name(name), age(age) {}Person(const Person & person) : name(person.name), age(person.age) {}~Person() {}NameType getName() { return name; }void setName(NameType name) { this->name = name; }AgeType getAge() { return age; }void setAge(AgeType age) { this->age = age; }private:NameType name;AgeType age;
};int main(int argc, char const *argv[])
{/*Person 類型帶有模版修飾,需要在使用之前明確模版對應的具體類型模版具備數據類型支持的多樣性,同時一旦確定模版類型,嚴格遵守數據類型一致化原則Person 類型如何確定模版對應的具體數據類型格式:類名<模版對應具體數據類型> * 對象 = new 類型<模版對應具體數據類型>(...);Person<NameType, AgeType>*/// p1 明確告知編譯器 NameType ==> string AgeType ==> int// 在后續的代碼中,通過 p1 調用 Person 類內函數按照以上規則完成Person<string, int> *p1 = new Person<string, int>();p1->setName("布丁");p1->setAge(3);cout << "Name : " << p1->getName() << ", Age : " << p1->getAge() << endl;Person<string, int> *p2 = new Person<string, int>("張三", 14);cout << "Name : " << p2->getName() << ", Age : " << p2->getAge() << endl;delete p1;delete p2;return 0;
}
2. 模版參數限制

雙重限制

  • 限制外部類型
  • 限制模版類型
#include <iostream>using namespace std;template <typename DataType, typename MsgType>
class Data
{
public:Data() {}Data(DataType value, MsgType msg) : value(value), msg(msg) {}Data(const Data &data) : value(data.value), msg(data.msg) {}~Data() {}DataType getValue() { return value; }void setValue(DataType value) { this->value = value; }MsgType getMsg() { return msg; }void setMsg(MsgType msg) { this->msg = msg; }private:DataType value;MsgType msg;
};/*
當前 test1 函數明確告知調用者,當前所需的參數為 Data
同時限制 Data 中對應的模版類型為 <int, string>
*/
void test1(Data<int, string> *data);/*
當前 test1 函數明確告知調用者,當前所需的參數為 Data
同時限制 Data 中對應的模版類型為 <double, string>
*/
void test1(Data<double, string> *data);int main(int argc, char const *argv[])
{/*雙重限制*/Data<int, string> *d1 = new Data<int, string>(10, "別困!");Data<double, string> *d2 = new Data<double, string>(3.14, "別困!!");Data<char, string> *d3 = new Data<char, string>('G', "遵守數據類型一致化原則");test1(d1);test1(d2);/*test1 函數重載操作,所需函數有兩種情況Data<int, string> *Data<double, string> *并沒有支持Data<char, string> * 考慮到雙重限制,分別對應外部類型和模版類型因此 d3 無法作為函數 test1 的實際參數【注意】請遵守數據類型一致化原則*/// test1(d3);delete d1;delete d2;delete d3;return 0;
}void test1(Data<int, string> *data)
{cout << "value : " << data->getValue() << ", Msg : " << data->getMsg() << endl;
}void test1(Data<double, string> *data)
{cout << "value : " << data->getValue() << ", Msg : " << data->getMsg() << endl;
}
3. 模版繼承
3.1 嚴格模式
#include <iostream>using namespace std;/*
類帶有模版,同時有子類繼承當前類1. 自由模式子類帶有和父類同名聲明模版2. 嚴格模式【當前模式】子類在繼承父類時,直接指定模版的具體類型,不得修改
*//*
MyCompare 類1. 聲明了模版2. 聲明純虛函數3. MyCompare 是一個抽象類
*/
template <typename T>
class MyCompare
{
public:// 純虛函數,并且使用了類聲明的模版virtual bool compare(T t1, T t2) = 0;
};
/*
IntCompare 類1. 繼承了 MyCompare 抽象類2. 繼承父類的過程中,同時限制了模版對應的具體類型3. IntCompare 類沒有聲明模版IntCompare 目標是一個【實現類】1. 必須實現 Compare 函數2. 父類 MyCompare 已經明確限制模版對應的具體類型為 int 類型3. IntCompare 目標實現的函數bool compare(int t1, int t2)
*/
class IntCompare : public MyCompare<int>
{
public:bool compare(int t1, int t2){return t1 > t2;}
};int main(int argc, char const *argv[])
{/*bool compare(long t1, long t2) {...}在明確 模版對應的類型為 int 類型,實現上面的函數實例化的過程中,會出現報錯:純虛擬 函數 "MyCompare<T>::compare [其中 T=int]" 沒有強制替代項*/IntCompare * ic = new IntCompare;cout << "ret : " << ic->compare(30, 20) << endl; // 1cout << "ret : " << ic->compare(10, 20) << endl; // 0return 0;
}
3.2 自由模式
#include <iostream>using namespace std;/*
類帶有模版,同時有子類繼承當前類1. 自由模式【當前模式】子類帶有和父類同名聲明模版2. 妻管嚴模式子類在繼承父類時,直接指定模版的具體類型,不得修改
*//*
MyCompare 類1. 聲明了模版2. 聲明純虛函數3. MyCompare 是一個抽象類
*/
template <typename T>
class BaseHandler
{
public:// 純虛函數,并且使用了類名聲明的模版virtual void handler(T t) = 0;
};/*
MyHander 繼承抽象類 BaseHandler,同時1. 聲明和 BaseHandler 同名模版2. 當前模版類型尚未明確3. 必須實現 void hander(T t) 函數
*/
template <typename T>
class MyHandler : public BaseHandler<T>
{
public:void handler(T t){cout << "數據情況 : " << t << endl;}
};int main(int argc, char const *argv[])
{// 實例化 MyHandler 類對象,需要指定模版對應的具體類型MyHandler<string> * m1 = new MyHandler<string>;m1->handler("零零零零");MyHandler<int> * m2 = new MyHandler<int>;m2->handler(14);delete m1;delete m2;return 0;
}
4. 模版類的模版函數
#include <iostream>using namespace std;template <typename T>
class Test
{
public:// 當前函數使用的模版為當前 Test 類聲明的模版void handler(T t) { cout << "value : " << t << endl; }/*模版類內的函數,期望可以自定義模版,使用的模版數據形式,約束與當前類不同*/template <typename T2>void my(T2 t) { cout << "value : " << t << endl; }
};int main(int argc, char const *argv[])
{Test<string> * test = new Test<string>;test->handler("零零零零");/*my 函數對應的模版類型,由實際參數決定,并不是實例化 Test 類型決定*/test->my(3.14);return 0;
}
5. 返回值類型帶有模版
#include <iostream>using namespace std;/*
K ==> Key   鍵
V ==> Value 值
*/
template <typename K, typename V>
class Data
{
public:Data() {}Data(K key, V value) : key(key), value(value) {}Data(const Data & data) : key(data.key), value(data.value) {}~Data() {}K getKey() { return key; }void setKey(K key) { this->key = key; }V getValue() { return value; }void setValue(V value) { this->value = value; }/*友元函數中,重載運算符操作,使用的模版并不是 Data 聲明的模版而是函數自定義模版,通過實際參數 Data 類型中的模版情況,限制當前函數的模版類型【滿足注意 Data 類型展示數據操作】*/template <typename K1, typename V1>friend ostream & operator<<(ostream & o, Data<K1, V1> * data);private:K key;V value;
};template <typename K1, typename V1>
ostream & operator<<(ostream & o, Data<K1, V1> * data)
{o << "Key : " << data->getKey() << ", Value : " << data->getValue();return o;
}template <typename K, typename V>
Data<K, V> *getData(K key, V value);int main(int argc, char const *argv[])
{string name = "MY";Data<string, int> * data = getData(name, 3);cout << data << endl;Data<double, int> * data1 = getData(6.18, 9999);cout << data1 << endl;delete data;delete data1;return 0;
}/*
外部函數自定義模版,返回值是 Data 類型,同時
利用當前函數的實際參數對 Data 中模版數據進行
約束限制,模版具體數據情況根據參數具體數據類型確定!
*/
template <typename K, typename V>
Data<K, V> * getData(K key, V value)
{return new Data<K, V>(key, value);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696504.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696504.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696504.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++ array容器用法詳解

array 容器是 C++ 11 標準中新增的序列容器,簡單地理解,它就是在 C++ 普通數組的基礎上,添加了一些成員函數和全局函數。在使用上,它比普通數組更安全(原因后續會講),且效率并沒有因此變差。 和其它容器不同,array 容器的大小是固定的,無法動態的擴展或收縮,這也就意…

【SpringCloud】使用 Spring Cloud Alibaba 之 Sentinel 實現微服務的限流、降級、熔斷

目錄 一、Sentinel 介紹1.1 什么是 Sentinel1.2 Sentinel 特性1.3 限流、降級與熔斷的區別 二、實戰演示2.1 下載啟動 Sentinel 控制臺2.2 后端微服務接入 Sentinel 控制臺2.2.1 引入 Sentinel 依賴2.2.2 添加 Sentinel 連接配置 2.3 使用 Sentinel 進行流控&#xff08;含限流…

SLAM ORB-SLAM2(19)特征點三角化

SLAM ORB-SLAM2(19)特征點三角化 1. 前言2. 初始化參數3. 計算投影矩陣4. 恢復三維點4.1. 計算推導4.2. Triangulate5. 檢查三維點5.1. 檢查三維點的深度值和視差角5.2. 檢查空間點的重投影誤差6. 最后處理1. 前言 在 《SLAM ORB-SLAM2(12)估算運動并初始地圖點》 中了解到…

如何將cocos2d-x js打包部署到ios上 Mac M1系統

項目環境 cocos2d-x 3.13 xcode 12 mac m1 big sur 先找到你的項目 使用xcode軟件打開上面這個文件 打開后應該是這個樣子 執行編譯運行就好了 可能會碰到的錯誤 在xcode11版本以上都會有這個錯誤&#xff0c;這是因為iOS11廢棄了system。 將上面代碼修改為 #if (CC_TARGE…

Java 面向對象進階 16 接口的細節:成員特點和接口的各種關系(黑馬)

成員變量默認修飾符是public static final的原因是&#xff1a; Java中接口中成員變量默認修飾符是public static final的原因是為了確保接口的成員變量都是公共的、靜態的和不可修改的。 - public修飾符確保了接口的成員變量可以在任何地方被訪問到。 - static修飾符使得接口…

vue-利用屬性(v-if)控制表單(el-form-item)顯示/隱藏

表單控制屬性 v-if 示例&#xff1a; 通過switch組件作為開關&#xff0c;控制表單的顯示與隱藏 <el-form-item label"創建數據集"><el-switch v-model"selectFormVisible"></el-switch></el-form-item><el-form-item label&…

Redis篇----第七篇

系列文章目錄 文章目錄 系列文章目錄前言一、Redis 的回收策略(淘汰策略)?二、為什么 edis 需要把所有數據放到內存中?三、Redis 的同步機制了解么?四、Pipeline 有什么好處,為什么要用 pipeline?前言 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍…

crontab history查看命令的執行時間

crontab crontab學習網站&#xff08;19. crontab 定時任務 — Linux Tools Quick Tutorial&#xff09; 例子 今天實際工作里用到的&#xff08;已經進行了防信息泄露處理 比如我現在希望每周三上午10:00之行一個php腳本 --gpt生成 00 10 * * 3 cd /home/user/project/r…

阿里云SSL免費證書到期自動申請部署程序

阿里云的免費證書只有3個月的有效期&#xff0c;不注意就過期了&#xff0c;還要手動申請然后部署&#xff0c;很是麻煩&#xff0c;于是寫了這個小工具。上班期間抽空寫的&#xff0c;沒有仔細測試&#xff0c;可能存在一些問題&#xff0c;大家可以自己clone代碼改改&#xf…

【大模型 數據增強】LLMAAA:使用 LLMs 作為數據標注器

【大模型 數據增強】LLMAAA&#xff1a;使用 LLMs 作為數據標注器 提出背景算法步驟1. LLM作為活躍標注者&#xff08;LLMAAA&#xff09;2. k-NN示例檢索與標簽表述化3. 活躍學習策略4. 自動重權技術 LLMAAA 框架1. LLM Annotator2. Active Acquisition3. Robust Training 總結…

SkyWalking之APM無侵入可觀測原理分析

一、 簡介&#xff08;為什么需要用到可觀測能力&#xff09; 隨著微服務的開發模式的興起&#xff0c;早期的單體架構系統已拆分為很多的子系統&#xff0c;各個子系統封裝為微服務&#xff0c;各服務間通過HTTP協議RESET API或者RPC協議進行調用。 在單體服務或者微服務較少的…

8:00面試,8:05就出來了 ,問的實在是....

從外包出來&#xff0c;沒想到竟然死在了另一家廠子 自從加入這家公司&#xff0c;每天都在加班&#xff0c;錢倒是給的不少&#xff0c;所以我也就忍了。沒想到12月一紙通知&#xff0c;所有人都不許加班&#xff0c;薪資直降30%&#xff0c;頓時有吃不起飯的趕腳。 好在有個…

AI推介-大語言模型LLMs論文速覽(arXiv方向):2024.02.05-2024.02.10

相關LLMs論文大多都是應用型文章&#xff0c;少部分是優化prompt/參數量級等等… 有一些應用文還是值得參考的&#xff0c;當工作面臨一個新的場景&#xff0c;可以學習下他人是如何結合LLMs與實際應用中的鏈接。 LLMs論文速覽&#xff1a;2024.02.05-2024.02.10&#xff1a; …

ESP8266智能家居(2)——8266發布數據到mqtt服務器

1.公共服務器 學習物聯網就離不開服務器&#xff0c;如果你資金充足的話&#xff0c;可以自己購買或者租用一個服務器。本次我選擇&#xff0c;使用免費的公共MQTT服務器。它的端口及Broker信息如下&#xff1a; 網址為&#xff1a; 免費的公共 MQTT 服務器 | EMQ (emqx.com)h…

LLMChain使用 | RouterChain的使用 - 用本地大模型搭建多Agents

單個本地大模型搭建參考博客 單個Chain&#xff1a;面對一個需求&#xff0c;我們需要創建一個llmchain&#xff0c;設置一個prompt模板&#xff0c;這個chain能夠接收一個用戶input&#xff0c;并輸出一個結果&#xff1b;多個Chain&#xff1a;考慮到同時面對多個需求&#x…

動態規劃背包問題

前言 動態規劃背包問題是一類經典的優化問題&#xff0c;涉及到選擇物品以最大化某個目標值&#xff08;通常是價值或利潤&#xff09;&#xff0c;同時受到某種約束&#xff08;如重量、體積或時間&#xff09;。背包問題可以分為多種類型&#xff0c;例如0-1背包問題、完全背…

第三百六十回

文章目錄 1. 概念介紹2. 實現方法2.1 環繞效果2.2 立體效果 3. 示例代碼4. 內容總結 我們在上一章回中介紹了"自定義SlideImageSwitch組件"相關的內容&#xff0c;本章回中將介紹兩種陰影效果.閑話休提&#xff0c;讓我們一起Talk Flutter吧。 1. 概念介紹 我們在本…

設計模式-創建型模式-原型模式

原型模式&#xff08;Prototype Pattern&#xff09;&#xff1a;使用原型實例指定創建對象的種類&#xff0c;并且通過克隆這些原型創建新的對象。原型模式是一種對象創建型模式。原型模式其實就是從一個對象再創建另外一個可定制的對象&#xff0c;而且不需知道任何創建的細節…

微信小程序開發學習筆記——2.8媒體組件image的src三種引入方式

>>跟著b站up主“咸蝦米_”學習微信小程序開發中&#xff0c;把學習記錄存到這方便后續查找。 課程連接&#xff1a; https://www.bilibili.com/video/BV19G4y1K74d?p11 image&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/component/image.html 一…

如何在Python中執行Shell腳本?

Python執行Shell命令 1、背景概述2、Python集成Shell及數據交互 1、背景概述 Python作為一種強大的腳本語言&#xff0c;其易用性和靈活性使得它成為自動化任務的理想選擇。在Python中執行Shell腳本可以實現一些操作系統級的功能&#xff0c;使程序更加靈活、易理解和易維護 在…