test.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;
};
TEST.CPP
#include "test.h"
inline A::~A(void){}
inline B::~B(void){}
inline C::~C(void){}
为什么有警告C4505'CC':已删除未引用的本地功能?
答案 0 :(得分:0)
你不能声明一个纯函数并在类体中定义它,它只是一个合法的语法。我不知道警告意味着您的编译器认为它意味着什么。
你需要做这样的事情(对于你所有的纯虚拟析构函数)。
class A {
public:
virtual void FunctionA() = 0;
virtual ~A() = 0;
};
inline A::~A() {}
或者,因为你在每个类中都至少有另一个纯虚函数,在这种情况下没有真正的优点使得析构函数是纯虚拟的,所以你可以这样做(在类体中):
virtual ~A() {}
编辑:此外,您需要为void
和A::FunctionA()
提供退货类型(例如B::FunctionB()
)。
答案 1 :(得分:0)
这是Pure virtual inheritance, multiple inheritance, and C4505的副本。我从那里重新引用了我的答案:
这是MSVC ++ 2010及更早版本中的错误。代码实际上得到了 即使编译器声称删除了代码,也会调用。好像是 已在MSVC ++ 2012中修复。其他编译器(如gcc或clang)不会发出警告。 语法" ... = 0 {...}"根据C ++ 03标准第10.4.2节(尽管MSVC ++没有抱怨)是非法的,因为它已被指出:
注意:函数声明不能同时提供pure-specifier和 定义
但是,通常定义纯虚拟析构函数并不违法,第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
由于代码似乎被调用,你可以忽略我认为的警告。