多重继承抽象类

时间:2012-06-09 15:49:28

标签: c++

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':已删除未引用的本地功能?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

virtual ~A() {}

编辑:此外,您需要为voidA::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

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