【问题标题】:Is void f() = 0 a virtual method?void f() = 0 是虚拟方法吗?
【发布时间】:2012-08-22 07:16:29
【问题描述】:

这里有点菜鸟怀疑(我的另一个问题:P)

关于我正在阅读的一本书:

  • 一个 Abstract Base-Class(ABC) 是通过纯虚方法的声明来实现的。
  • 使方法成为纯虚方法的是声明末尾的= 0
  • 您可以这样声明:virtual void f() = 0; 这样您就不需要在 ABC 中定义它,但派生类必须实现它自己的版本。
  • 但是你也可以像这样声明一个虚方法:void f() = 0; 这样你就需要在 ABC 中定义方法,派生类可以这样使用它。 ABC 需要这种方法,其方法都被其派生类普遍应用。

如果以上几点都是真的,我不明白的是:虚方法到底是什么?

因为void f() = 0; 在我看来是一种常规方法。 ABC 将定义它,而派生对象将使用 ABC 的定义,就像任何其他公共方法一样。是否有对这两个实例具有吸引力的虚拟方法定义?

纯虚函数或纯虚方法是虚函数 需要由非派生类实现 摘要

这个定义是从这个网站的另一个问题中挑选出来的。所以我的猜测是我正在阅读的书是错误的? void f() = 0; 声明该类是 ABC,但它不是纯虚方法。有人可以确认或向我解释一下吗?

【问题讨论】:

    标签: c++ methods virtual abstract-class derived-class


    【解决方案1】:
    void f() = 0;
    

    除非基类将f() 定义为virtual,否则这是错误的。例如:

    class A
    {
    public:
       virtual void f() = 0;
    };
    
    class B : A
    {
       void f() = 0;
    }
    

    上述内容是合法的,因为f() 本质上是virtual。否则,不行。

    tl;dr 您不能将非虚拟方法声明为纯方法,但方法可以是虚拟的,而无需显式指定 virtual 关键字(通过继承)。我希望这就是这本书所说的,否则我倾向于说这是一本蹩脚糟糕的书。

    【讨论】:

    • 一旦我们定义了A::f() {...} 的主体,B::f 会是任何A::f 吗??
    • @David 不,如果您在 B 中覆盖它,则不会。
    • B 中的void f() = 0 是否暗示B 的派生类必须实现它们自己的f 版本?
    • @David 不一定。派生类也可以将f 声明为纯类,但它们也将是抽象类。
    • @Kurospidey 哦,我明白了。这通常通过将析构函数标记为纯虚拟来实现。
    【解决方案2】:

    函数(C++ 没有方法)如果标记为virtual 或覆盖基类中的虚函数,则它是虚函数。一个虚函数可以用= 0标记为“纯虚函数”;这意味着不必定义该函数,并且直接从该类派生的类也是抽象类,除非它们覆盖该函数(以及任何其他纯虚函数)。覆盖函数也可以使用= 0 使覆盖器成为纯虚拟的。

    【讨论】:

    • @LuchianGrigore - 你不认为 what 是真的吗?当然,我所说的有些东西是正确的......<g>
    • “方法”是计算机科学术语,表示成员函数(或与对象关联的函数)。这样,C++ 确实有方法。对事物使用相同的命名约定非常重要,因此在这方面,我认为您的陈述 C++ 没有方法 不仅是错误的,而且是错误的信息。
    • @LokiAstari - 阅读 C++ 标准:它不会在任何地方使用这种意义上的“方法”。使用相同的命名约定非常重要; C++ 标准应该是术语的指南。
    • @LokiAstari - “无关紧要”?我想这个讨论已经结束了。感谢您的意见。
    • @Peter Becker:我知道 C++ 标准没有提到它。但正如我在上一篇文章中指出的那样,这无关紧要。术语“方法”的含义是明确定义的。而且你不能在没有上下文的情况下写英语,这里的上下文是计算机科学(你可以认为它是意义所基于的元语言)。
    猜你喜欢
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2016-07-08
    • 2016-10-11
    • 1970-01-01
    相关资源
    最近更新 更多