使用继承的析构函数警告C4710(未内联)

时间:2011-03-07 12:42:01

标签: c++ inheritance inline destructor compiler-warnings

我有3个类来构建一个继承链。其中两个类是纯抽象的(IProxy和IDataProxy),第三个类真的“完成工作”(DataProxy)。这些类如下(仅显示con / destructors):

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 )
{}

当我使用Microsoft C ++编译器(版本12.00.8804)编译类DataProxy时,我收到以下警告:

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

我真的不知道这些警告的来源。我从未告诉编译器内联任何东西。我不知道如何摆脱这些警告。

有人能否对这些警告有所了解?非常感谢!

祝你好运,     奥利弗

3 个答案:

答案 0 :(得分:4)

通过在类中定义构造函数,您可以隐式添加inline说明符。虚函数(包括析构函数)没有内联。

然而,警告肯定来自于dllexport函数必须具有给定(thiscall)调用约定的事实,因此永远不会内联。如果虚拟成员函数非多态地被称为,则可以内联。这将永远不会出现这种情况。

@MSalters的评论提供了为什么IProxy::~IProxy()没有发出警告的提示。

要消除警告,请在源文件中定义空的析构函数。

答案 1 :(得分:0)

通过在类中提供析构函数的实现,您要求内联它们。构造函数和成员函数也是如此。

答案 2 :(得分:-2)

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

此链接清楚地说明了您需要了解的所有内容。它清楚地说明了警告是什么,它发生的原因以及默认情况下警告是关闭的。如果内联定义,类成员函数将隐式内联。通常需要在提出问题之前付出一些努力 - 例如在编译器的文档中搜索警告编号。