1

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

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

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

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

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

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

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

4

2 回答 2

9
void f() = 0;

除非基类定义f()virtual. 例如:

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

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

以上是合法的,因为f()本质上是virtual. 否则,没有。

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

于 2012-08-27T19:14:34.827 回答
0

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

于 2012-08-27T19:20:01.663 回答