【问题标题】:C++ header file and function declaration ending in "= 0"以“= 0”结尾的 C++ 头文件和函数声明
【发布时间】:2011-02-01 03:59:03
【问题描述】:

我在 .h 文件中有以下代码,但我不确定赋值语句的作用以及如何正确调用它?

virtual void yield() = 0;

我认为该函数默认返回值 0 但由于该函数返回 void 我有点困惑。任何人都可以对此发表评论,或者说我该如何引用这个作业,我的意思是它在 C++ 行话中是如何调用的?

谢谢。

【问题讨论】:

标签: c++ virtual-functions


【解决方案1】:

如果是纯虚方法(又名抽象)看这里或谷歌http://www.artima.com/cppsource/pure_virtual.html

= 0 不代表默认返回值,通知函数是纯虚函数

【讨论】:

  • 不,它不是——它表示该函数是纯函数。纯虚函数可以有实体。
  • 那么它们与只是虚拟的有何不同?
  • 它们防止包含它们的类被实例化。
【解决方案2】:

= 0 语法声明了一个pure virtual function,它与返回值无关。

如果一个类至少包含一个纯虚函数,这使得该类“抽象”,这意味着它不能被实例化。

在实践中,这些类需要通过子类化和实现虚函数来具体化。

【讨论】:

    【解决方案3】:

    语法晦涩难懂,但“=0”表示该方法是纯虚函数。它使类抽象(你不能实例化它),它的实现留给派生类。

    当您只想定义一个接口时使用它。如果要定义接口并提供默认实现,请使用 virtual 关键字。

    【讨论】:

      【解决方案4】:

      这是一个纯虚函数。这意味着,子类必须实现这个函数,否则它们是抽象的,这意味着你不能创建该类的对象。

      class ISomeInterface {
      public:
          virtual std::string ToString( ) = 0;
      }
      
      class SomeInterfaceImpl : public ISomeInterface {
      public:
          virtual std::string ToString( ) {
              return "SomeInterfaceImpl";
          }
      }
      

      这个想法是,一个类可以公开某个方法,但子类必须实现它。在这个例子中,ISomeInterface 公开了一个 ToString 方法,但是没有合理的默认实现,所以它使方法纯虚拟。然后像SomeInterfaceImpl 这样的子类可以提供合适的实现。

      【讨论】:

      • OP 询问 “在 C++ 行话中如何称呼它?” - 这在我回答的第一句话中得到了回答。如果您觉得这需要进一步解释,请随时编辑我的答案、添加您自己的答案或在评论中解释。
      • 好的。很公平。我对“= 0”感到困惑,但是,我想我最终弄明白了。 “= 0”告诉编译器不会有函数体,这使它成为“纯虚拟”。对吗?
      • 不完全。纯虚函数can have a body。有关语法的说明,请参阅this question
      猜你喜欢
      • 2015-06-10
      • 1970-01-01
      • 2017-06-22
      • 2020-03-22
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 2011-04-14
      相关资源
      最近更新 更多