-1

测试.h

class A
{
    public:
        virtual void FunctionA(void) = 0;
        virtual ~A(void);
};
class B
{
    public:
        virtual void FunctionB(void) = 0;
        virtual ~B(void);
};
class C:public A, public B 
{
    public:
        virtual ~C(void) = 0;
};

测试.cpp

#include "test.h"
inline A::~A(void){}
inline B::~B(void){}
inline C::~C(void){}

为什么会有警告 C4505 'C:~C' : unreferenced local function has been removed ?

4

2 回答 2

0

您不能声明一个纯函数并在类主体中定义它,这不是合法的语法。我不知道警告意味着您的编译器认为它意味着什么。

你需要做这样的事情(对于你所有的纯虚拟析构函数)。

class A {
public:
    virtual void FunctionA() = 0;
    virtual ~A() = 0;
};
inline A::~A() {}

或者,因为无论如何你的每个类中至少有一个纯虚函数,所以在这种情况下使析构函数纯虚函数没有真正的优点,所以你可以这样做(在类主体中):

virtual ~A() {}

编辑:另外,你需要有一个返回类型(例如voidA::FunctionA()B::FunctionB()

于 2012-06-09T15:54:29.123 回答
0

这是纯虚拟继承、多重继承和 C4505的副本。我从那里重新引用我的答案:

这是 MSVC++ 2010 及更早版本中的错误。即使编译器声称已删除代码,代码实际上也会被调用。它似乎已在 MSVC++ 2012 中修复。其他编译器(如 gcc 或 clang)不会发出警告。根据 C++03 标准第 10.4.2 节,语法“... = 0 {...}”是非法的(即使 MSVC++ 没有抱怨),正如已经指出的那样:

注意:函数声明不能​​同时提供纯说明符和定义

然而,定义一个纯虚析构函数通常不是非法的,第 12.4.7 节指出:

析构函数可以声明为虚拟(10.3)或纯虚拟(10.4);如果在程序中创建了该类或任何派生类的任何对象,则应定义析构函数。如果一个类有一个带有虚拟析构函数的基类,那么它的析构函数(无论是用户声明的还是隐式声明的)都是虚拟的。

我禁用警告的方法是将以下几行添加到标题中:

#if defined(_MSC_VER) && (_MSC_VER <= 1600)
#  pragma warning(disable:4505)
#endif

如果您想在本地更多地禁用警告,那么#pragma warning( push )可能#pragma warning( pop )会有所帮助。请参阅http://msdn.microsoft.com/en-us/library/2c8f766e(v=vs.80).aspx

由于代码似乎被调用,我认为您可以忽略警告。

于 2013-08-01T15:42:36.010 回答