簡體   English   中英

__declspec(dllimport / dllexport)和繼承

[英]__declspec(dllimport/dllexport) and inheritance

給定具有以下類的DLL:

#define DLLAPI __declspec(...)

class DLLAPI Base
{
    public:
    virtual void B();
};

class Derived : public Base
{
    public:
    virtual void B();
    virtual void D();
};

即使“DLLAPI”關鍵字未應用於類定義(至少,不是直接),我的“派生”類是否可以在dll之外顯示?

“D()”功能是否可見?

謝謝

您的DLL不會導出類Derived。 類不繼承導出。 同時添加DLLAPI。

另請注意,類成員默認使用私有輔助功能,因此無法訪問任何方法。 但是,我確實看到Base :: B()在我的測試中被導出。 DLL使用代碼中的C ++標頭會標記錯誤,但我想知道你是否在那里調整了標頭,如果你可以欺騙它。

無論如何,如果你在你的DLL中實例化了一個Derived(通過另一個入口點),虛擬表應該仍然可以工作,所以如果你這樣做了:

Base* b = getTheDerived(); b->B();

你會調用Derived :: B()。

您可以通過鍵入從Visual Studio命令shell中找到

link /dump /exports <yourdll>

如果導出它們,您將看到函數的“裝飾名稱”。 要查看它們的人類可讀格式,請復制粘貼一個並執行

undname <decorated name>

不,Derived將不會在DLL外部顯示。 為了導出派生類,您還必須將DLLAPI宏應用於派生類。

您必須使基類和派生類都可導出,

http://msdn.microsoft.com/en-us/library/81h27t8c.aspx

All base classes of an exportable class must be exportable. If not, a compiler 
warning is generated.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM