C++ 无法将变量声明为抽象类型,因为虚拟函数是纯函数-具有多重继承

C++ 无法将变量声明为抽象类型,因为虚拟函数是纯函数-具有多重继承,c++,inheritance,abstract-class,abstract,C++,Inheritance,Abstract Class,Abstract,我已经看到了这类问题的多种答案,但我不知道如何解决它。主要的问题可能是我正在处理别人的代码,但是我知道。以下是此问题的简化示例: 我有一个类链接了许多其他类: class Interface : public system_atoms, public system_io, /* etc, others */ { /* A few functions, none that matters here - none from the inherited classes redefi

我已经看到了这类问题的多种答案,但我不知道如何解决它。主要的问题可能是我正在处理别人的代码,但是我知道。以下是此问题的简化示例: 我有一个类链接了许多其他类:

class Interface
  : public system_atoms,
    public system_io,
    /* etc, others */
{
/* A few functions, none that matters here - none from the inherited classes redefined */
}
在system_atoms内部,我有:

class system_atoms {
public:
    virtual int init_atom(int atom_number) = 0;
    virtual int check_atom_id(int atom_number) = 0;
}
我有一个类应该从接口继承:

class Interface_proxy : public Interface {
public: 
/* stuff - no function from the inherited classes redefined */
}
在.cpp中:

Interface_proxy global_interface_proxy;
编译时出现一个错误,说明“无法将变量
全局接口代理
声明为抽象类型
接口代理
,因为虚拟函数[系统原子中列出的两个]是纯函数”

我也不是很精通C++。我想我应该将这两个虚函数重新定义为纯函数(没有
=0
virtual
对吗?)这样变量就不是抽象类型了。但是我的知识就到此为止了——多重继承让我很困惑。

A是一个虚拟函数,并且明确没有实现(用尾部的
=0
表示)。纯虚拟函数旨在强制派生类为该函数提供自己的实现。换句话说,派生类最终将为该函数定义自己的行为

抽象类是具有一个或多个纯虚函数的类,因为它至少声明了一个或继承自抽象类,并且不会覆盖所有继承的纯虚函数。这些类不能被实例化(您不能创建它的实例),因为它们的行为没有完全定义。它们只能用作其他类型的基类

在您的例子中,
system\u atoms
定义了两个纯虚函数,因此它是一个抽象类。您列出的从
system\u atoms
继承的每个类也是抽象的,因为它们都继承自那些纯虚函数,并且从不重写它们

正确的解决方案是通过重写为派生类中的那些纯虚拟函数提供实现

见 和说明符

多重继承在这里不起作用,只是每个继承的类可能有自己的纯虚拟函数。只需在正常情况下覆盖纯虚拟函数。

A是一个虚拟函数,并且显式没有实现(用尾部的
=0
表示)。纯虚拟函数旨在强制派生类为该函数提供自己的实现。换句话说,派生类最终将为该函数定义自己的行为

抽象类是具有一个或多个纯虚函数的类,因为它至少声明了一个或继承自抽象类,并且不会覆盖所有继承的纯虚函数。这些类不能被实例化(您不能创建它的实例),因为它们的行为没有完全定义。它们只能用作其他类型的基类

在您的例子中,
system\u atoms
定义了两个纯虚函数,因此它是一个抽象类。您列出的从
system\u atoms
继承的每个类也是抽象的,因为它们都继承自那些纯虚函数,并且从不重写它们

正确的解决方案是通过重写为派生类中的那些纯虚拟函数提供实现

见 和说明符


多重继承在这里不起作用,只是每个继承的类可能有自己的纯虚拟函数。通常只需重写纯虚函数。

如果类具有纯虚方法,则无法创建该类的实例。它被称为抽象类。所有派生类都必须实现这些方法,否则它们也将是抽象的。即使没有可变继承,您也会得到相同的错误。如果您想声明一个
接口_代理
,它需要是指针或引用,然后您必须指向或引用实现纯fns的实际非抽象(例如接口_代理)。如果类具有纯虚拟方法,则无法创建类的实例。它被称为抽象类。所有派生类都必须实现这些方法,否则它们也将是抽象的。即使没有可变继承,您也会得到相同的错误。如果您想声明一个
接口代理
,它需要是一个指针或引用,然后您必须指向或引用实现纯fns的实际非抽象(例如接口代理)。谢谢。如果我正确理解了这一点,那么我需要在Interface_proxy中重写这两个函数,比如
intinit_atom(intatom_number)override
@Marlon Yes,对于
检查\u atom\u id
。然后你必须实现它们。您可能需要思考,对于您的案例,这些方法的适当行为是什么。请给出最佳答案,谢谢。如果我正确理解了这一点,那么我需要在Interface_proxy中重写这两个函数,比如
intinit_atom(intatom_number)override
@Marlon Yes,对于
检查\u atom\u id
。然后你必须实现它们。你可能需要思考,对于你的案例,这些方法的适当行为是什么。有史以来最好的答案