Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多重继承抽象类_C++ - Fatal编程技术网

C++ 多重继承抽象类

C++ 多重继承抽象类,c++,C++,测试h test.cpp 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: v

测试h

test.cpp

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;
};

为什么出现警告C4505'C:~C':未引用的本地函数已被删除?

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

您需要这样做(对于所有纯虚拟析构函数)

或者,由于每个类中至少有一个纯虚函数,因此在这种情况下,将析构函数设置为纯虚函数没有任何实际价值,因此您可以(在类体中)执行以下操作:

编辑:此外,对于
a::function()
B::FunctionB()
B::FunctionB()
,这是一个重复的返回类型。我从那里再次询问我的答案:

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

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

但是,定义纯虚拟析构函数通常并不违法,第12.4.7节规定:

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

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

virtual ~A() {}

<代码> >如果定义(μMSCYFER)&(实际上,GCC给了我一个更让人放心的代码<错误:函数定义< /COD>纯纯说明符)我修改了代码。但是它仍然有警告。(通过VisualStudioC++编译器)如果这是头文件(后编辑),您需要标记析构函数
内联
,因为定义不在类主体中。我将析构函数标记为内联,但警告不会消失。请发布一个显示警告的最小完整可编译示例。与您的问题无关:如果参数列表为空,则不需要将
void
放入参数列表中这是C中唯一需要的,不是C++的,如果我使用C++编译,不能在参数中放“空格”吗?
class A {
public:
    virtual void FunctionA() = 0;
    virtual ~A() = 0;
};
inline A::~A() {}
virtual ~A() {}
#if defined(_MSC_VER) && (_MSC_VER <= 1600)
#  pragma warning(disable:4505)
#endif