__declspec(dllimport/dllexport) и наследование
Вопрос
Дана библиотека DLL со следующими классами :
#define DLLAPI __declspec(...)
class DLLAPI Base
{
public:
virtual void B();
};
class Derived : public Base
{
public:
virtual void B();
virtual void D();
};
Будет ли мой "Производный" класс виден вне библиотеки dll, даже если ключевое слово "DLLAPI" не применяется к определению класса (по крайней мере, не напрямую)?
Видна ли функция "D()" для?
Спасибо
Решение
производный класс не будет экспортирован вашей библиотекой DLL.Классы не наследуют экспорт.Добавьте к этому еще DLLAPI.
Обратите также внимание, что члены класса по умолчанию имеют закрытый доступ, поэтому ни один из ваших методов не должен быть доступен.Тем не менее, я вижу, что Base::B () экспортируется в моем тесте.Заголовок C ++ в коде, использующем DLL, будет указывать на ошибку, но мне интересно, изменили ли вы там заголовок, сможете ли вы его обмануть.
В любом случае, если вы создали экземпляр производной внутри вашей библиотеки DLL (через другую точку входа), виртуальная таблица все равно должна работать, поэтому, если вы сделали:
Base* b = getTheDerived(); b->B();
вы бы вызвали Derived::B() .
Другие советы
Вы можете узнать это из командной оболочки Visual Studio, набрав
link /dump /exports <yourdll>
Если они будут экспортированы, вы увидите "оформленные имена" для функций.Чтобы увидеть, какие они в удобочитаемом формате, скопируйте и вставьте один из них и выполните
undname <decorated name>
Нет, производный не будет виден за пределами библиотеки 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.