C++ 虛函數(shù)實(shí)戰(zhàn)示例詳解
你這段代碼展示了一個(gè)典型的 C++ 面向?qū)ο笤O(shè)計(jì)框架,特別適合用于設(shè)備驅(qū)動(dòng)接口、攝像頭/傳感器采集接口、或嵌入式系統(tǒng)中的數(shù)據(jù)流采集模塊。
下面我們來逐層講解你這個(gè)代碼在干什么:
? 一、抽象基類 cap_ops
class cap_ops {
public:
virtual ~cap_ops() {};
virtual int init() { return 0; }
virtual int open(streamCb callback) = 0;
virtual int start() = 0;
virtual int stop() = 0;
virtual int close() = 0;
virtual int custom_ioctl(int type, void *input, void *output) {
return 0;
}
};? 功能:
這是一個(gè)純虛基類(抽象接口),表示“某種可采集的設(shè)備操作集合(capture operations)”。
?? 特點(diǎn)說明:
| 成員 | 含義 |
|---|---|
virtual ~cap_ops() | 虛析構(gòu)函數(shù),保證子類析構(gòu)時(shí)資源能正確釋放 |
init() | 可選初始化操作,提供默認(rèn)實(shí)現(xiàn) |
open()、start()、stop()、close() | 純虛函數(shù)(= 0),必須由子類實(shí)現(xiàn) |
custom_ioctl() | 自定義控制命令(提供默認(rèn)空實(shí)現(xiàn)) |
? 二、具體子類 Device_Info 實(shí)現(xiàn)接口
class Device_Info : public cap_ops {
public:
Device_Info();
~Device_Info();
int open(streamCb callback);
int start();
int stop();
int close();
// 拓展的功能函數(shù)
int get_soc_temp(void);
int get_mcu_temp(void);
int get_cpu_use_rate(void);
int get_ram_use_rate(void);
int get_rgb_frame_rate(void);
int get_dtof_frame_rate(void);
int get_point_cloud_rate(void);
Version_ID_t get_soc_app_version(void);
Version_ID_t get_soc_kernel_version(void);
Version_ID_t get_mcu_version(void);
Version_ID_t get_soc_Daemon_proc_version(void);
Version_ID_t get_soc_slam_alo_version(void);
int get_sensor_dtof_temp(void);
private:
void device_info_capture(void *arg);
int fd = -1; // 設(shè)備文件描述符
std::atomic<bool> capture; // 控制采集線程狀態(tài)
streamCb callback; // 數(shù)據(jù)回調(diào)函數(shù)
std::thread thread; // 采集線程
std::mutex syncMutex; // 用于線程同步
std::condition_variable syncCond; // 用于線程同步
};? 作用:
這個(gè)類是對(duì) cap_ops 的具體實(shí)現(xiàn),是一個(gè)實(shí)際的“設(shè)備信息采集類”。
你可以這樣理解:
cap_ops是“接口”,Device_Info是“具體設(shè)備的實(shí)現(xiàn)”。
? 三、你這個(gè)類的用途總結(jié)
這個(gè)類典型用法如下圖:
cap_ops* dev = new Device_Info(); dev->open(my_callback); dev->start(); // 后續(xù)處理……
也可以在設(shè)備框架中注冊(cè):
std::vector<cap_ops*> device_list; device_list.push_back(new Device_Info());
這樣你可以實(shí)現(xiàn)多種設(shè)備的統(tǒng)一抽象管理,比如不同攝像頭、IMU、溫度傳感器、RGBD 模塊等都繼承 cap_ops。
? 四、線程相關(guān)部分說明
類中有如下成員:
std::thread thread; std::mutex syncMutex; std::condition_variable syncCond; std::atomic<bool> capture;
這些是典型的 采集線程控制器,說明這個(gè)類很可能:
- 在
start()中創(chuàng)建一個(gè)采集線程 - 在線程中讀取設(shè)備數(shù)據(jù)(比如通過 I²C、USB、文件系統(tǒng)等)
- 然后通過
callback反饋數(shù)據(jù)出去 - 在
stop()中停止線程 - 在
close()中釋放資源
? 五、你應(yīng)該怎么使用它?
例如你可以這么寫:
Device_Info device; device.open(my_stream_callback); // 注冊(cè)回調(diào) device.start(); // 啟動(dòng)采集線程 // … 等待采集 … device.stop(); // 停止采集 device.close(); // 關(guān)閉設(shè)備
? 六、補(bǔ)充建議
如果你是這個(gè)代碼的維護(hù)者/開發(fā)者,可以考慮做以下改進(jìn):
- 使用
std::unique_ptr<cap_ops>管理資源,避免泄漏; open()函數(shù)建議加參數(shù)檢查(回調(diào)不能是空);- 加入日志宏,便于跟蹤設(shè)備采集狀態(tài);
- 若涉及多個(gè)設(shè)備,可做一個(gè)
Device_Manager統(tǒng)一管理不同cap_ops子類。
如果你想調(diào)試這個(gè)類的線程問題、數(shù)據(jù)采集流程、或某個(gè) get_cpu_use_rate() 等函數(shù)實(shí)現(xiàn),我也可以進(jìn)一步幫你分析。歡迎貼上代碼繼續(xù)交流。
非常好!作為 C++ 初學(xué)者,你現(xiàn)在接觸的是 C++ 面向?qū)ο缶幊痰暮诵母拍钪唬撼橄箢?和 虛函數(shù)機(jī)制。你這段代碼非常典型,下面我會(huì)用通俗易懂的方式來講清楚你看到的每一部分,幫助你徹底理解這個(gè)“接口類”的作用。
? 一、這段代碼是干什么的?
class cap_ops {
public:
virtual ~cap_ops() {};
virtual int init() { return 0; }
virtual int open(streamCb callback) = 0;
virtual int start() = 0;
virtual int stop() = 0;
virtual int close() = 0;
virtual int custom_ioctl(int type, void *input, void *output) {
return 0;
}
};這是一個(gè) 抽象接口類(英文通常叫 interface base class),意思是:
定義了一組功能接口(函數(shù)名和參數(shù)),但不關(guān)心具體怎么實(shí)現(xiàn)。由“子類”去繼承并實(shí)現(xiàn)這些功能。
它的設(shè)計(jì)目標(biāo)就是:“統(tǒng)一接口,便于擴(kuò)展”,常用于大型項(xiàng)目的架構(gòu)設(shè)計(jì)中。
? 二、逐句解釋代碼
class cap_ops { ... };
定義了一個(gè)類,名字叫 cap_ops,可以理解為:“捕獲操作(Capture Operations)”。
virtual ~cap_ops() {};
這是一個(gè) 虛析構(gòu)函數(shù),目的是為了讓你在通過基類指針釋放子類對(duì)象時(shí),能正確析構(gòu)子類資源。
cap_ops* p = new Device_Info(); // 派生類對(duì)象 delete p; // ? 若析構(gòu)函數(shù)是虛函數(shù),才能正確釋放子類資源
面試???!
virtual int init() { return 0; }
- 這是一個(gè)虛函數(shù),有默認(rèn)實(shí)現(xiàn),子類可以選擇重寫(override)。
- 比如有些設(shè)備需要初始化,有些不需要,這里提供默認(rèn)實(shí)現(xiàn)
return 0(代表成功)。
virtual int open(streamCb callback) = 0;
這個(gè) = 0 表示這是一個(gè)純虛函數(shù),意思是:
這個(gè)函數(shù)必須由子類實(shí)現(xiàn),否則這個(gè)類不能被實(shí)例化。
這種函數(shù)通常用來定義“接口”,而不提供實(shí)現(xiàn)。例如打開設(shè)備、設(shè)置回調(diào)等。
virtual int start() = 0;、stop()、close()
也是純虛函數(shù),表示所有繼承 cap_ops 的子類都必須實(shí)現(xiàn)這幾個(gè)函數(shù),否則編譯不過。
virtual int custom_ioctl(...) { return 0; }
這是一個(gè)帶有默認(rèn)實(shí)現(xiàn)的虛函數(shù),代表設(shè)備的“自定義命令接口”(很像 Linux 驅(qū)動(dòng)中的 ioctl),
子類可以選擇重寫它,也可以使用默認(rèn)實(shí)現(xiàn)。
? 三、為啥要這樣設(shè)計(jì)?(舉個(gè)栗子??)
假設(shè)你現(xiàn)在要支持三種設(shè)備:
- 攝像頭(Camera)
- 麥克風(fēng)(Microphone)
- 溫度傳感器(TempSensor)
它們的功能不同,但“打開/啟動(dòng)/停止/關(guān)閉”的操作流程很相似。
你可以統(tǒng)一寫一個(gè)接口類 cap_ops,然后不同設(shè)備繼承它:
class Camera : public cap_ops {
int open(streamCb cb) override { ... }
int start() override { ... }
int stop() override { ... }
int close() override { ... }
};
class Microphone : public cap_ops {
// 實(shí)現(xiàn)類似函數(shù)
};然后你就可以統(tǒng)一管理這些設(shè)備了,比如用一個(gè)數(shù)組:
std::vector<cap_ops*> devices;
devices.push_back(new Camera());
devices.push_back(new Microphone());
for (auto dev : devices) {
dev->open(my_cb);
dev->start();
}你無需關(guān)心它到底是哪個(gè)設(shè)備,反正都符合接口規(guī)范!
這就是面向?qū)ο笾凶顝?qiáng)大的思想之一:多態(tài)(Polymorphism)。
? 四、總結(jié):這段代碼學(xué)到了什么?
| 概念 | 解釋 |
|---|---|
virtual | 表示虛函數(shù),可以被子類重寫 |
= 0 | 表示純虛函數(shù),子類必須實(shí)現(xiàn)(抽象接口) |
| 抽象類 | 有至少一個(gè)純虛函數(shù)的類,不能直接實(shí)例化 |
| 多態(tài) | 父類指針調(diào)用子類實(shí)現(xiàn)的函數(shù)(通過 virtual 實(shí)現(xiàn)) |
| 接口設(shè)計(jì) | 抽象類定義規(guī)范,子類實(shí)現(xiàn)具體功能 |
| 虛析構(gòu)函數(shù) | 用父類指針刪除子類對(duì)象時(shí),必須加 virtual 保證資源釋放完整 |
? 如果你想更深入了解
我可以為你寫一個(gè)完整的例子,展示這個(gè)接口類和子類如何協(xié)作工作,包括:
- 如何 new 一個(gè)子類對(duì)象;
- 如何通過 cap_ops* 來調(diào)用接口;
- 如何啟動(dòng)采集線程、回調(diào)函數(shù)等;
只需要說一聲“寫個(gè)完整 demo 給我”,我馬上就給你寫 ????。
你已經(jīng)邁出了 C++ 面向?qū)ο蟮年P(guān)鍵一步,很棒了!繼續(xù)保持!??
到此這篇關(guān)于C++ 虛函數(shù)實(shí)戰(zhàn)介紹的文章就介紹到這了,更多相關(guān)C++ 虛函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實(shí)現(xiàn)求解素?cái)?shù)的N種方法總結(jié)
哈嘍各位友友們,今天又學(xué)到了很多有趣的知識(shí),現(xiàn)在迫不及待的想和大家分享一下!本文將手把手帶領(lǐng)大家探討利用試除法、篩選法求解素?cái)?shù)的n層境界!都是精華內(nèi)容,可不要錯(cuò)過喲2023-01-01
C++ OpenCV實(shí)現(xiàn)灰度圖蒙版GrayMask的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用C++和OpenCV實(shí)現(xiàn)灰度圖蒙版GrayMask,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定參考價(jià)值,需要的可以參考一下2022-05-05
C++string中的insert()插入函數(shù)詳解
這篇文章主要介紹了C++string中的insert()插入函數(shù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03

