2009-08-12 9 views
5

eine DLL mit den folgenden Klassen Gegeben:__declspec (dllimport/dllexport) und Vererbung

#define DLLAPI __declspec(...) 

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

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

Wird mein „Abgeleitet“ Klasse sichtbar außerhalb der DLL sein, auch wenn die „DLLAPI“ Schlüsselwort nicht auf die angewendet wird, Klassendefinition (zumindest nicht direkt)?

Ist die Funktion "D()" sichtbar?

Dank

Antwort

4

Klasse Derived wird nicht von Ihrer DLL exportiert. Klassen erben nicht den Export. Dazu auch DLLAPI hinzufügen.

Beachten Sie auch, dass die Klassenmitglieder standardmäßig auf private Zugänglichkeit eingestellt sind, sodass keine Ihrer Methoden zugänglich sein sollte. Ich sehe jedoch, dass Base :: B() in meinem Test exportiert wird. Der C++ - Header in dem DLL-verwendenden Code würde den Fehler kennzeichnen, aber ich frage mich, ob Sie den Header dort optimiert haben, wenn Sie es täuschen könnten.

Wie auch immer, wenn Sie ein in Ihrem DLL (über einen anderen Zugangspunkt) Abgeleitete hat instanziiert, sollte die virtuelle Tabelle immer noch funktionieren, wenn Sie also tat:

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

Sie würden Abgeleitet aufrufen :: B ().

3

Sie aus einem Visual Studio-Befehls-Shell

link /dump /exports <yourdll> 

durch Eingabe Wenn sie ausgeführt werden, werden Sie „ergänzte Namen“ für die Funktionen sehen herausfinden können. Um zu sehen, was sie in lesbarer Form ist, copy-paste ein und tun

undname <decorated name> 
1

Nein, Abgeleitet wird nicht sichtbar außerhalb der DLL sein. Um die abgeleitete Klasse zu exportieren, müssten Sie den DLLAPI-Makro auch auf abgeleitete Klassen anwenden.