【问题标题】:Set a virtual function declaration to zero? [duplicate]将虚函数声明设置为零? [复制]
【发布时间】:2011-03-21 08:07:28
【问题描述】:

可能重复:
Why pure virtual function is initialized by 0?

在 C++ 中,将函数声明设置为零是什么意思?我猜它与虚拟函数有关,而不是在这个类中实际定义。在我正在阅读的代码头文件中找到:

virtual void SetValue(double val)=0;

这是怎么回事?

【问题讨论】:

  • 打开您最喜欢的 C++ 书籍并阅读有关纯虚函数的内容。通过在论坛上提出一般性问题来学习语言的基础知识并不是一件有意义的事情。一些信息可以在这里找到en.wikipedia.org/wiki/Virtual_function
  • @Troubadour:FWIW:这个问题来自“这甚至意味着什么”的角度,而这个问题是“鉴于这个含义,为什么它看起来像这样”
  • @AndreyT 在我的辩护中,语法是如此神秘,以至于我不知道要查找纯虚函数(我已经理解了)。我想说在论坛上问这个通用问题对我来说非常有意义。
  • tinyurl.com/2dbotnc --- 看第二个结果。
  • @AndreyT,如果提问者不知道“=0”表示纯虚函数,他们怎么会知道查找“纯虚函数”?我了解您来自哪里,但可以学习和使用 C++ 一段时间而不会遇到这个概念。

标签: c++ oop


【解决方案1】:

表示class是抽象的,不能创建它的对象。它可以用作另一个基础class
c++ 中也使用纯虚拟类作为interface,从像java 这样的语言知道,但当然是不同的。

【讨论】:

    【解决方案2】:

    这是一个pure virtual function。它使您必须派生一个类(并实现所述功能)才能使用它。

    【讨论】:

    • 除了派生之外,您还必须在派生类中实现它们。
    • 这会产生一个抽象类。
    【解决方案3】:

    如果你设置了一个虚函数来设置,它被称为纯虚函数。然后你的类变成一个抽象类。 除非实现了纯虚函数,否则无法创建该类或任何子类的实例。

    【讨论】:

      【解决方案4】:

      这意味着它是一个纯虚方法 - 这意味着子类必须自己实现该方法。该方法仍然可以实现,但无法实例化具有纯虚方法的类,这类似于在各种其他语言中看到的 abstract 关键字。

      【讨论】:

      • 尽管名称纯虚方法可以有一个实现...纯虚的声明意味着类是抽象的,派生类必须实现非抽象的函数。这并不意味着该方法在基类中没有实现(实际上它可以在基类中有实现)。
      • 啊,是的,当然。我的错。我会编辑我的帖子。
      • 挑剔:C++ 有函数,而不是方法。正确的说法是纯虚函数
      【解决方案5】:

      这在 C++ 术语中称为纯虚成员函数。正如您所猜测的那样,这意味着该函数不是在类中定义的,而是必须在派生类中实现。你不能用纯虚成员函数来实例化类,纯虚函数基本上表现得像 Java 或 C# 中的抽象方法。

      【讨论】:

      • 这并不意味着它没有被定义,只是它必须被覆盖。它可以有一个定义。
      【解决方案6】:

      SetValue 方法是纯虚的。它的类不提供该方法的实现,并且不能被实例化(因此我们称之为抽象)。另一方面,具体派生类必须为这些方法提供实现。查看更多here

      【讨论】:

        【解决方案7】:

        正如大家所提到的,这意味着该函数是一个纯虚函数。将此视为将函数指针设置为空。具有纯虚函数的类作为抽象类处理。这意味着派生类必须实现这个虚函数。

        有时,您可能会遇到所谓的“纯调用”错误。这意味着实际上调用了一个纯虚函数,它很可能会导致程序崩溃。纯调用最常见的原因是调用该函数的对象已被删除。

        【讨论】:

          【解决方案8】:

          “SetValue”是基类强制派生类提供的纯虚成员函数。纯虚成员函数将没有实现。

          纯虚成员函数指定成员函数将存在于具体派生类的每个对象上,即使该成员函数(通常)未在基类中定义。

          这是因为如果派生类打算实例化(即,如果它们打算具体化),指定纯虚成员函数的语法会强制派生类实现成员函数。

          在您的情况下,从基类派生的类的所有对象都将具有成员函数 SetValue()。但是,由于基类是一个抽象概念,它没有包含足够的信息来实现 SetValue()。

          想象一下“= 0”就像是在说“这个函数的代码在 NULL 指针处。”

          纯虚成员函数允许用户针对具有多种功能不同变体的接口编写代码。这意味着如果这些对象都在同一个抽象基类的保护伞下,则可以将语义不同的对象传递给函数。

          【讨论】:

            猜你喜欢
            • 2020-04-26
            • 1970-01-01
            • 2018-02-12
            • 2014-08-04
            • 2014-11-18
            • 1970-01-01
            • 2020-10-19
            • 2012-02-24
            • 1970-01-01
            相关资源
            最近更新 更多