Предупреждение C4710 (не встроено) с унаследованными деструкторами - PullRequest
2 голосов
/ 07 марта 2011

У меня есть 3 класса, которые строят цепочку наследования. Два из этих классов являются чисто абстрактными (IProxy и IDataProxy), третий действительно «выполняет свою работу» (DataProxy). Классы следующие (здесь показаны только кон / деструкторы):

IProxy:

class __declspec(dllexport) IProxy
{
public:
    IProxy() {}
    virtual ~IProxy() {}
};

IDataProxy:

class __declspec(dllexport) IDataProxy : public IProxy
{
public:
    IDataProxy() {}
    virtual ~IDataProxy() {}
};

Заголовок DataProxy:

class __declspec(dllexport) DataProxy : public IDataProxy
{
public:
    DataProxy();
    virtual ~DataProxy() {}
};

Файл реализации DataProxy:

DataProxy::DataProxy() : m_operationType( eUnknown )
{}

При компиляции класса DataProxy с помощью компилятора Microsoft C ++ (версия 12.00.8804) я получаю следующие предупреждения:

warning C4710: function 'virtual __thiscall IDataProxy::~IDataProxy(void)' not inlined<br> warning C4710: function 'virtual __thiscall IDataProxy::~IDataProxy(void)' not inlined<br> warning C4710: function 'virtual __thiscall DataProxy::~DataProxy(void)' not inlined<br> warning C4710: function 'virtual __thiscall DataProxy::~DataProxy(void)' not inlined

Я действительно не знаю, откуда приходят эти предупреждения. Я никогда не говорил компилятору ничего встроить. И я понятия не имею, как избавиться от этих предупреждений.

Может ли кто-нибудь пролить свет на эти предупреждения? Большое спасибо!

С уважением, Oliver

Ответы [ 3 ]

4 голосов
/ 07 марта 2011

Определяя конструкторы внутри класса, вы неявно добавляете спецификатор inline.Виртуальные функции (включая деструкторы) не являются встроенными.

Однако предупреждение, скорее всего, связано с тем, что функция dllexport должна иметь заданное (thiscall) соглашение о вызовах и, следовательно, никогда не будет встроенным.Виртуальные функции-члены могут быть встроенными, если они вызываются не полиморфно.Это никогда не будет иметь место.

@ Комментарий MSalters дает подсказку, почему предупреждение не появляется для IProxy::~IProxy().

Чтобы избавиться от предупреждения, определите свой пустойдеструкторы в исходном файле.

0 голосов
/ 07 марта 2011

http://msdn.microsoft.com/en-us/library/yd3056cz(v=VS.100).aspx

Эта ссылка четко объясняет все, что вам нужно знать.В нем четко указано, что это за предупреждение, почему оно происходит, и что предупреждение отключено по умолчанию.Функции-члены класса неявно встроены, если определены встроенными.Обычно требуется небольшое усилие, прежде чем задавать вопрос - например, поиск в документации вашего компилятора номера предупреждения.

0 голосов
/ 07 марта 2011

Предоставляя реализацию деструкторов в классе, вы просите их встроить.Это также верно для конструкторов и функций-членов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...