亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Qt動(dòng)態(tài)庫(kù)調(diào)用宿主進(jìn)程中的對(duì)象方法純虛函數(shù)使用

 更新時(shí)間:2022年08月12日 16:20:44   作者:Fake瑞克  
這篇文章主要為大家介紹了Qt動(dòng)態(tài)庫(kù)調(diào)用宿主進(jìn)程中的對(duì)象方法純虛函數(shù)使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

可執(zhí)行程序加載動(dòng)態(tài)庫(kù)并調(diào)用動(dòng)態(tài)庫(kù)導(dǎo)出的函數(shù)是比較容易的:

導(dǎo)入庫(kù)對(duì)應(yīng)的頭文件

在CPP文件中調(diào)用函數(shù)

在鏈接程序時(shí)加上動(dòng)態(tài)庫(kù)作為參數(shù)

假設(shè)demo.cpp中需要用到動(dòng)態(tài)庫(kù)libadd.so中的某個(gè)函數(shù),可能是int add(int x, int y),那么我們編譯時(shí)就需要鏈接上libadd.so, gcc參數(shù)中-L./libs指定了當(dāng)前目錄下的libs目錄為庫(kù)的目錄,-ladd指定了libadd.so動(dòng)態(tài)庫(kù)文件,注意這里并未使用全稱,讓編譯器自動(dòng)適配即可。

// 該方式為靜態(tài)導(dǎo)入方式(在程序未運(yùn)行時(shí)完成導(dǎo)入)
gcc demo.cpp -o demo -L./libs -ladd

在運(yùn)行時(shí)加載動(dòng)態(tài)庫(kù)并獲取對(duì)象指針(QLibrary)

// 導(dǎo)入動(dòng)態(tài)庫(kù)
QLibrary m_library;
m_library.setFileName("./libs/libadd.so");
assert(m_library.load());
// 獲取函數(shù)指針
typedef int (*FUNC_ADD)(int, int);
FUNC_ADD add = (FUNC_ADD)m_library.resolve("add");
assert(add);
// 愉快的使用add函數(shù)
int a = add(125, 125);
qDebug() << a;

本貼重點(diǎn):在動(dòng)態(tài)庫(kù)中調(diào)用宿主進(jìn)程的對(duì)象方法

先復(fù)習(xí)下兩個(gè)概念:純虛函數(shù)虛函數(shù)表

  • 純虛函數(shù)在類中定義后是可以不用實(shí)現(xiàn)的,子類如繼承含有純虛函數(shù)的類必須實(shí)現(xiàn)該類所有的純虛函數(shù)。純虛函數(shù)可作接口使用。
  • C++擁有虛函數(shù)表(V-Table),存儲(chǔ)著虛函數(shù)地址的表。

假設(shè)動(dòng)態(tài)庫(kù)需要調(diào)用宿主進(jìn)程的對(duì)象方法,在動(dòng)態(tài)庫(kù)編譯時(shí)時(shí)無(wú)法獲取到宿主程序該對(duì)象的實(shí)現(xiàn)的,所以按照正常邏輯是無(wú)法編譯通過(guò)的。

但是通過(guò)上邊有效的復(fù)習(xí)可以知道純虛函數(shù)在調(diào)用時(shí)可無(wú)需實(shí)現(xiàn)(在運(yùn)行時(shí)通過(guò)查詢虛函數(shù)表后獲取實(shí)際地址),這樣就可以順利的完成了編譯,當(dāng)動(dòng)態(tài)庫(kù)被加載進(jìn)宿主進(jìn)程后就可以正常調(diào)用對(duì)象的方法了。

還是以add方法為例寫一個(gè)Demo

宿主程序:

#ifndef __MATH_H__
#define __MATH_H__
// 接口定義
class IMath
{
public:
    virtual int add(int x, int y) = 0;
};
typedef void (*FUNC_SET_OBJ)(void*);
class Math: public IMath
{
public:
    Test() {
        m_library.setFileName("./libs/libtest.so");
        assert(m_library.load());
        FUNC_SET_OBJ setObj= (FUNC_SET_OBJ)m_library.resolve("setObj");
        assert(setObj);
        // 將Math實(shí)例傳遞給動(dòng)態(tài)庫(kù)
        setObj(this);
    }
    int add(int x, int y) ovdrride {
        return x + y;
    }
private:
    QLibrary m_library;
}
#endif

然后將接口做成一個(gè)獨(dú)立的頭文件imath.h,用來(lái)給動(dòng)態(tài)庫(kù)調(diào)用

#ifndef __IMATH_H__
#define __IMATH_H__
class IMath
{
public:
    virtual int add(int x, int y) = 0;
};
#endif

動(dòng)態(tài)庫(kù)程序(libtest.cpp):

void setObj(void* obj) {
    IMath* math = static_cast<IMath*>(obj);
    qDebug() << math->add(125, 125);
}

將動(dòng)態(tài)庫(kù)程序編譯后放入libs目錄下給宿主程序調(diào)用,在宿主程序中實(shí)例化Math類,并調(diào)用其Test方法,在Test方法中會(huì)加載動(dòng)態(tài)庫(kù),并將Math實(shí)例的指針傳遞給動(dòng)態(tài)庫(kù),動(dòng)態(tài)庫(kù)將Math實(shí)例強(qiáng)轉(zhuǎn)為接口類型并調(diào)用其中的純虛函數(shù)add()。

以上就是Qt動(dòng)態(tài)庫(kù)調(diào)用宿主進(jìn)程中的對(duì)象方法純虛函數(shù)使用的詳細(xì)內(nèi)容,更多關(guān)于Qt動(dòng)態(tài)庫(kù)調(diào)用宿主進(jìn)程純虛函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Cocos2d-x UI開發(fā)之菜單類使用實(shí)例

    Cocos2d-x UI開發(fā)之菜單類使用實(shí)例

    這篇文章主要介紹了Cocos2d-x UI開發(fā)之菜單類使用實(shí)例,本文的代碼中含有詳細(xì)注釋,需要的朋友可以參考下
    2014-09-09
  • C++學(xué)習(xí)之異常機(jī)制詳解

    C++學(xué)習(xí)之異常機(jī)制詳解

    C++中的異常處理機(jī)制可以幫助我們處理程序在運(yùn)行時(shí)可能會(huì)遇到的異常情況,比如內(nèi)存分配錯(cuò)誤、文件打開失敗等。本文就和大家詳細(xì)講講C++中異常機(jī)制的具體使用吧
    2023-04-04
  • C++之WSAAsyncSelect模型實(shí)例

    C++之WSAAsyncSelect模型實(shí)例

    這篇文章主要介紹了C++的WSAAsyncSelect模型,實(shí)例講述了socket與Windows消息機(jī)制的用法,需要的朋友可以參考下
    2014-10-10
  • C++中輸出十六進(jìn)制形式的字符串

    C++中輸出十六進(jìn)制形式的字符串

    這篇文章主要給大家介紹了C++中輸出十六進(jìn)制形式的字符串,文中給出了詳細(xì)的介紹,有需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2016-12-12
  • C語(yǔ)言實(shí)現(xiàn)串的順序存儲(chǔ)表示與基本操作

    C語(yǔ)言實(shí)現(xiàn)串的順序存儲(chǔ)表示與基本操作

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)串的順序存儲(chǔ)表示與基本操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++判斷子序列題目詳解

    C++判斷子序列題目詳解

    這篇文章主要為大家介紹了C++判斷子序列題目,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • C++核心編程之內(nèi)存分區(qū)詳解

    C++核心編程之內(nèi)存分區(qū)詳解

    這篇文章主要為大家詳細(xì)介紹了C++核心編程之內(nèi)存分區(qū),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • c++類和對(duì)象基本概念

    c++類和對(duì)象基本概念

    這篇文章主要為大家介紹了c++類和對(duì)象,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • C++跳轉(zhuǎn)語(yǔ)句之Goto對(duì)變量定義的影響詳解

    C++跳轉(zhuǎn)語(yǔ)句之Goto對(duì)變量定義的影響詳解

    goto語(yǔ)句也被稱為無(wú)條件轉(zhuǎn)移語(yǔ)句,這篇文章主要介紹了C++跳轉(zhuǎn)語(yǔ)句之Goto對(duì)變量定義的影響,文中通過(guò)示例代碼解文字介紹的很詳細(xì),相信對(duì)大家的理解和學(xué)習(xí)具有一定的參考借鑒價(jià)值,有需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11
  • C語(yǔ)言實(shí)現(xiàn)線索二叉樹的前中后創(chuàng)建和遍歷詳解

    C語(yǔ)言實(shí)現(xiàn)線索二叉樹的前中后創(chuàng)建和遍歷詳解

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)線索二叉樹的前中后創(chuàng)建和遍歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02

最新評(píng)論