C++ 虛函數(shù)實戰(zhàn)示例詳解
你這段代碼展示了一個典型的 C++ 面向對象設計框架,特別適合用于設備驅動接口、攝像頭/傳感器采集接口、或嵌入式系統(tǒng)中的數(shù)據(jù)流采集模塊。
下面我們來逐層講解你這個代碼在干什么:
? 一、抽象基類 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;
}
};? 功能:
這是一個純虛基類(抽象接口),表示“某種可采集的設備操作集合(capture operations)”。
?? 特點說明:
| 成員 | 含義 |
|---|---|
virtual ~cap_ops() | 虛析構函數(shù),保證子類析構時資源能正確釋放 |
init() | 可選初始化操作,提供默認實現(xiàn) |
open()、start()、stop()、close() | 純虛函數(shù)(= 0),必須由子類實現(xiàn) |
custom_ioctl() | 自定義控制命令(提供默認空實現(xiàn)) |
? 二、具體子類 Device_Info 實現(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; // 設備文件描述符
std::atomic<bool> capture; // 控制采集線程狀態(tài)
streamCb callback; // 數(shù)據(jù)回調(diào)函數(shù)
std::thread thread; // 采集線程
std::mutex syncMutex; // 用于線程同步
std::condition_variable syncCond; // 用于線程同步
};? 作用:
這個類是對 cap_ops 的具體實現(xiàn),是一個實際的“設備信息采集類”。
你可以這樣理解:
cap_ops是“接口”,Device_Info是“具體設備的實現(xiàn)”。
? 三、你這個類的用途總結
這個類典型用法如下圖:
cap_ops* dev = new Device_Info(); dev->open(my_callback); dev->start(); // 后續(xù)處理……
也可以在設備框架中注冊:
std::vector<cap_ops*> device_list; device_list.push_back(new Device_Info());
這樣你可以實現(xiàn)多種設備的統(tǒng)一抽象管理,比如不同攝像頭、IMU、溫度傳感器、RGBD 模塊等都繼承 cap_ops。
? 四、線程相關部分說明
類中有如下成員:
std::thread thread; std::mutex syncMutex; std::condition_variable syncCond; std::atomic<bool> capture;
這些是典型的 采集線程控制器,說明這個類很可能:
- 在
start()中創(chuàng)建一個采集線程 - 在線程中讀取設備數(shù)據(jù)(比如通過 I²C、USB、文件系統(tǒng)等)
- 然后通過
callback反饋數(shù)據(jù)出去 - 在
stop()中停止線程 - 在
close()中釋放資源
? 五、你應該怎么使用它?
例如你可以這么寫:
Device_Info device; device.open(my_stream_callback); // 注冊回調(diào) device.start(); // 啟動采集線程 // … 等待采集 … device.stop(); // 停止采集 device.close(); // 關閉設備
? 六、補充建議
如果你是這個代碼的維護者/開發(fā)者,可以考慮做以下改進:
- 使用
std::unique_ptr<cap_ops>管理資源,避免泄漏; open()函數(shù)建議加參數(shù)檢查(回調(diào)不能是空);- 加入日志宏,便于跟蹤設備采集狀態(tài);
- 若涉及多個設備,可做一個
Device_Manager統(tǒng)一管理不同cap_ops子類。
如果你想調(diào)試這個類的線程問題、數(shù)據(jù)采集流程、或某個 get_cpu_use_rate() 等函數(shù)實現(xiàn),我也可以進一步幫你分析。歡迎貼上代碼繼續(xù)交流。
非常好!作為 C++ 初學者,你現(xiàn)在接觸的是 C++ 面向對象編程的核心概念之一:抽象類 和 虛函數(shù)機制。你這段代碼非常典型,下面我會用通俗易懂的方式來講清楚你看到的每一部分,幫助你徹底理解這個“接口類”的作用。
? 一、這段代碼是干什么的?
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;
}
};這是一個 抽象接口類(英文通常叫 interface base class),意思是:
定義了一組功能接口(函數(shù)名和參數(shù)),但不關心具體怎么實現(xiàn)。由“子類”去繼承并實現(xiàn)這些功能。
它的設計目標就是:“統(tǒng)一接口,便于擴展”,常用于大型項目的架構設計中。
? 二、逐句解釋代碼
class cap_ops { ... };
定義了一個類,名字叫 cap_ops,可以理解為:“捕獲操作(Capture Operations)”。
virtual ~cap_ops() {};
這是一個 虛析構函數(shù),目的是為了讓你在通過基類指針釋放子類對象時,能正確析構子類資源。
cap_ops* p = new Device_Info(); // 派生類對象 delete p; // ? 若析構函數(shù)是虛函數(shù),才能正確釋放子類資源
面試???!
virtual int init() { return 0; }
- 這是一個虛函數(shù),有默認實現(xiàn),子類可以選擇重寫(override)。
- 比如有些設備需要初始化,有些不需要,這里提供默認實現(xiàn)
return 0(代表成功)。
virtual int open(streamCb callback) = 0;
這個 = 0 表示這是一個純虛函數(shù),意思是:
這個函數(shù)必須由子類實現(xiàn),否則這個類不能被實例化。
這種函數(shù)通常用來定義“接口”,而不提供實現(xiàn)。例如打開設備、設置回調(diào)等。
virtual int start() = 0;、stop()、close()
也是純虛函數(shù),表示所有繼承 cap_ops 的子類都必須實現(xiàn)這幾個函數(shù),否則編譯不過。
virtual int custom_ioctl(...) { return 0; }
這是一個帶有默認實現(xiàn)的虛函數(shù),代表設備的“自定義命令接口”(很像 Linux 驅動中的 ioctl),
子類可以選擇重寫它,也可以使用默認實現(xiàn)。
? 三、為啥要這樣設計?(舉個栗子??)
假設你現(xiàn)在要支持三種設備:
- 攝像頭(Camera)
- 麥克風(Microphone)
- 溫度傳感器(TempSensor)
它們的功能不同,但“打開/啟動/停止/關閉”的操作流程很相似。
你可以統(tǒng)一寫一個接口類 cap_ops,然后不同設備繼承它:
class Camera : public cap_ops {
int open(streamCb cb) override { ... }
int start() override { ... }
int stop() override { ... }
int close() override { ... }
};
class Microphone : public cap_ops {
// 實現(xiàn)類似函數(shù)
};然后你就可以統(tǒng)一管理這些設備了,比如用一個數(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ī)范!
這就是面向對象中最強大的思想之一:多態(tài)(Polymorphism)。
? 四、總結:這段代碼學到了什么?
| 概念 | 解釋 |
|---|---|
virtual | 表示虛函數(shù),可以被子類重寫 |
= 0 | 表示純虛函數(shù),子類必須實現(xiàn)(抽象接口) |
| 抽象類 | 有至少一個純虛函數(shù)的類,不能直接實例化 |
| 多態(tài) | 父類指針調(diào)用子類實現(xiàn)的函數(shù)(通過 virtual 實現(xiàn)) |
| 接口設計 | 抽象類定義規(guī)范,子類實現(xiàn)具體功能 |
| 虛析構函數(shù) | 用父類指針刪除子類對象時,必須加 virtual 保證資源釋放完整 |
? 如果你想更深入了解
我可以為你寫一個完整的例子,展示這個接口類和子類如何協(xié)作工作,包括:
- 如何 new 一個子類對象;
- 如何通過 cap_ops* 來調(diào)用接口;
- 如何啟動采集線程、回調(diào)函數(shù)等;
只需要說一聲“寫個完整 demo 給我”,我馬上就給你寫 ????。
你已經(jīng)邁出了 C++ 面向對象的關鍵一步,很棒了!繼續(xù)保持!??
到此這篇關于C++ 虛函數(shù)實戰(zhàn)介紹的文章就介紹到這了,更多相關C++ 虛函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
基于MATLAB神經(jīng)網(wǎng)絡圖像識別的高識別率代碼
今天小編就為大家分享一篇關于基于MATLAB神經(jīng)網(wǎng)絡圖像識別的高識別率代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03
C語言數(shù)據(jù)的存儲超詳細講解下篇浮點型在內(nèi)存中的存取
使用編程語言進行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當您創(chuàng)建一個變量時,就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么2022-04-04
C++的靜態(tài)成員變量和靜態(tài)成員函數(shù)詳解
這篇文章主要為大家介紹了C++的靜態(tài)成員變量和靜態(tài)成員函數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2021-12-12
C語言中回調(diào)函數(shù)的含義與使用場景詳解(2)
這篇文章主要為大家詳細介紹了C語言中回調(diào)函數(shù)的含義與使用場景,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03

