【问题标题】:Cannot declare variable to be of abstract type because the virtual functions are pure - with multiple inheritance不能将变量声明为抽象类型,因为虚函数是纯的 - 具有多重继承
【发布时间】:2017-12-10 15:06:49
【问题描述】:

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

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;

编译时会出现错误提示“无法将变量 global_interface_proxy 声明为抽象类型 Interface_proxy,因为虚函数 [system_atoms 中列出的两个] 是纯函数”。

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

【问题讨论】:

  • 如果该类具有纯虚方法,则不能创建该类的实例。它被称为抽象类。所有派生类都必须实现这些方法,否则它们也将是抽象的。
  • 即使没有多重继承,你也会得到同样的错误。如果你想声明一个Interface_proxy,它需要是一个指针或引用,然后你必须指向或引用实际的非抽象(例如Interface_proxy),它确实实现了纯fns。

标签: c++ inheritance abstract-class abstract


【解决方案1】:

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

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

在您的情况下,system_atoms 定义了 2 个纯虚函数,因此它是一个抽象类。您列出的每个继承自 system_atoms 的类也是抽象的,因为它们都继承自那些纯虚函数并且从不覆盖它们。

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

virtual functionsoverride 说明符。

这里不涉及多重继承,除了每个继承的类可能有自己的纯虚函数。只需正常覆盖纯虚函数即可。

【讨论】:

  • 谢谢。如果我理解正确,那么我需要在 Interface_proxy 中重写这两个函数,例如int init_atom(int atom_number) override;
  • @Marlon 是的,对于check_atom_id。然后你必须实施它们。您可能需要考虑针对您的案例,这些方法的适当行为是什么。
  • 最佳答案
猜你喜欢
  • 2013-03-09
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 2021-12-07
  • 2012-12-12
  • 2016-03-01
  • 2014-06-01
相关资源
最近更新 更多