void f()= 0是一个虚方法吗?

时间:2012-08-27 19:12:44

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

这里有一点否定的怀疑(另一个来自我:P)

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

  • 一个抽象基类( ABC )是纯虚方法的声明。
  • 使方法成为纯虚方法的原因是声明末尾的= 0
  • 您可以将此声明为:virtual void f() = 0;这样您就不需要在ABC中定义它,但派生类必须实现它自己的版本。
  • 但你也可以声明一个这样的虚方法:void f() = 0;这种方式你需要在ABC中定义方法,派生类可以像这样使用它。 ABC需要这种方法,其方法通常由其派生类应用。

如果以上所有要点都是真的,我不明白的是:什么是虚拟方法?

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

  

纯虚函数或纯虚方法是虚函数   这是必需由派生类实现的   抽象

此定义是从本网站的另一个问题中挑选出来的。所以我的猜测是我读的那本书错了吗? void f() = 0;表示该类是ABC,但它不是纯虚方法。有人可以证实这一点或向我解释一下吗?

2 个答案:

答案 0 :(得分:8)

void f() = 0;

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

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

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

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

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

答案 1 :(得分:0)

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