最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 虛函數(shù)實(shí)戰(zhàn)示例詳解

 更新時(shí)間:2025年07月16日 10:24:45   作者:W1E  
C++抽象基類cap_ops定義設(shè)備操作接口,支持多態(tài),統(tǒng)一管理攝像頭、傳感器等設(shè)備,包含線程控制與資源管理方法,建議使用智能指針和日志,便于擴(kuò)展和維護(hù),本文給大家介紹C++ 虛函數(shù)實(shí)戰(zhàn),感興趣的朋友一起看看吧

你這段代碼展示了一個(gè)典型的 C++ 面向?qū)ο笤O(shè)計(jì)框架,特別適合用于設(shè)備驅(qū)動接口、攝像頭/傳感器采集接口、或嵌入式系統(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è)類是對 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è)備框架中注冊:

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);  // 注冊回調(diào)
device.start();                   // 啟動采集線程
// … 等待采集 …
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ī)制。你這段代碼非常典型,下面我會用通俗易懂的方式來講清楚你看到的每一部分,幫助你徹底理解這個(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ù),目的是為了讓你在通過基類指針釋放子類對象時(shí),能正確析構(gòu)子類資源。

cap_ops* p = new Device_Info();  // 派生類對象
delete p;  // ? 若析構(gòu)函數(shù)是虛函數(shù),才能正確釋放子類資源

面試??迹?/strong>

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ū)動中的 ioctl),
子類可以選擇重寫它,也可以使用默認(rèn)實(shí)現(xiàn)。

? 三、為啥要這樣設(shè)計(jì)?(舉個(gè)栗子??)

假設(shè)你現(xiàn)在要支持三種設(shè)備:

  • 攝像頭(Camera)
  • 麥克風(fēng)(Microphone)
  • 溫度傳感器(TempSensor)

它們的功能不同,但“打開/啟動/停止/關(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ù)用父類指針刪除子類對象時(shí),必須加 virtual 保證資源釋放完整

? 如果你想更深入了解

我可以為你寫一個(gè)完整的例子,展示這個(gè)接口類和子類如何協(xié)作工作,包括:

  • 如何 new 一個(gè)子類對象;
  • 如何通過 cap_ops* 來調(diào)用接口;
  • 如何啟動采集線程、回調(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于MATLAB神經(jīng)網(wǎng)絡(luò)圖像識別的高識別率代碼

    基于MATLAB神經(jīng)網(wǎng)絡(luò)圖像識別的高識別率代碼

    今天小編就為大家分享一篇關(guān)于基于MATLAB神經(jīng)網(wǎng)絡(luò)圖像識別的高識別率代碼,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • C語言圖書管理系統(tǒng)簡潔版

    C語言圖書管理系統(tǒng)簡潔版

    這篇文章主要為大家詳細(xì)介紹了C語言圖書管理系統(tǒng)簡潔版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++實(shí)現(xiàn)PatchMatch圖像修復(fù)算法

    C++實(shí)現(xiàn)PatchMatch圖像修復(fù)算法

    這篇文章主要介紹了C++實(shí)現(xiàn)PatchMatch圖像修復(fù)算法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • C語言數(shù)據(jù)的存儲超詳細(xì)講解下篇浮點(diǎn)型在內(nèi)存中的存取

    C語言數(shù)據(jù)的存儲超詳細(xì)講解下篇浮點(diǎn)型在內(nèi)存中的存取

    使用編程語言進(jìn)行編程時(shí),需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會在內(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ù)詳解

    這篇文章主要為大家介紹了C++的靜態(tài)成員變量和靜態(tài)成員函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • C語言數(shù)據(jù)的存儲超詳細(xì)講解中篇練習(xí)

    C語言數(shù)據(jù)的存儲超詳細(xì)講解中篇練習(xí)

    使用編程語言進(jìn)行編程時(shí),需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么
    2022-04-04
  • C++判斷一個(gè)點(diǎn)是否在圓內(nèi)的方法

    C++判斷一個(gè)點(diǎn)是否在圓內(nèi)的方法

    這篇文章主要為大家詳細(xì)介紹了C++判斷一個(gè)點(diǎn)是否在圓內(nèi)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • C++11新特性之lambda、包裝器詳解

    C++11新特性之lambda、包裝器詳解

    lambda表達(dá)式是一種匿名函數(shù)對象,可以定義在函數(shù)內(nèi)部,用于定義輕量級的局部小函數(shù),本文給大家介紹C++11新特性之lambda、包裝器的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • C語言中回調(diào)函數(shù)的含義與使用場景詳解(2)

    C語言中回調(diào)函數(shù)的含義與使用場景詳解(2)

    這篇文章主要為大家詳細(xì)介紹了C語言中回調(diào)函數(shù)的含義與使用場景,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C語言求質(zhì)數(shù)的幾種簡單易懂方式

    C語言求質(zhì)數(shù)的幾種簡單易懂方式

    這篇文章主要介紹了C語言求質(zhì)數(shù)的幾種簡單易懂方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評論

宜章县| 景洪市| 右玉县| 宁强县| 剑川县| 东山县| 库伦旗| 涪陵区| 中山市| 五河县| 肇庆市| 通河县| 广安市| 疏勒县| 微山县| 克拉玛依市| 隆子县| 横峰县| 白银市| 桂平市| 赤城县| 商河县| 湖州市| 甘谷县| 渭源县| 孝义市| 昌吉市| 汉寿县| 民县| 常德市| 海南省| 广水市| 岚皋县| 琼海市| 涡阳县| 石家庄市| 柏乡县| 唐河县| 四平市| 荆门市| 万全县|