2

以下两个声明有什么区别?

virtual void calculateBase() = 0;  
virtual void calculateBase();

我读到第一个(= 0)是一个“纯抽象函数”,但是第二个是什么?

4

8 回答 8

8

第一个是“纯虚拟”——它会使类抽象,试图实例化它会导致编译器错误。它旨在用作派生类通过实现纯虚函数来实现必要行为的基类。尽管可以,但您不必在基类中实现该函数。
这是一种常用于两种设计模式的模式:

  • 模板方法”设计模式,基类围绕函数调用实现结构,但函数调用的细节必须由派生类填写,以及
  • “接口”设计模式,因为 C++ 没有 interface 关键字。抽象基类,理想情况下只有纯虚函数,没有成员数据,是定义接口的 C++ 方式。

第二个声明只是一个普通的虚成员函数声明。如果未能在基类中实现成员函数,则会出现编译器错误。它仍然是虚拟的,这意味着覆盖派生类中的行为可能很有用。

于 2009-09-14T09:43:32.917 回答
7

第一个称为纯虚函数。通常纯虚函数不会有任何实现,并且您不能创建包含纯虚函数的类的实例。

第二个是虚函数(即“正常”虚函数)。一个类提供了这个函数的实现,但是它的派生类可以通过为这个方法提供它自己的实现来覆盖这个实现。

于 2009-09-14T09:40:50.770 回答
4

第一个不必在基类中实现,但强制它在继承类中实现。

您必须在基类中实现第二个,它可以在继承类中实现。

于 2009-09-14T09:40:26.590 回答
3

基本上,在继承时,您必须覆盖第一个,并允许覆盖第二个。

来自Java,不是吗?

于 2009-09-14T09:40:37.203 回答
1

我认为您在混淆术语...

virtual void x() = 0;

是纯虚函数,或抽象函数。它是一个没有实现的虚函数。你谈论一个纯抽象类,它是一个接口的 c++ 等价物,一个只有抽象函数的类。

virtual void x();

是一个虚函数,意味着它可以在派生类中重新定义,但它不是抽象的,所以你必须为它提供一个实现。

于 2009-09-14T09:43:01.010 回答
1

虚拟 void calculateBase() = 0;

第一个函数是纯虚函数,不能在类中实现,它充当纯抽象类或接口类。具体的实现应该在子类中完成或覆盖。它充当其派生类的接口类。

虚拟 void calculateBase();

这个函数是虚函数,实现(默认)可以在基类中完成。但是,派生类必须重写它自己的实现。

于 2009-09-14T11:37:43.067 回答
0

第二个函数必须在声明它的类中有一个实现(缺少'= 0'),并且可以被子类覆盖。

第一个函数在声明它的类中可能有也可能没有实现,并且必须由子类实现

于 2009-09-14T09:41:52.517 回答
0

在 Java 中

virtual void calculateBase() = 0;  

将会

abstract void calculateBase();

virtual void calculateBase();

将会

void calculateBase();

要完全清楚,

void calculateBase();

在 C++ 中,与

final void calculateBase();

在爪哇。也就是说,final 在 C++ 中是“默认值”。然而,这条规则有一个例外。当使用虚拟方法子类化一个类并在不使用 virtual 关键字的情况下重新实现它时,子类中的方法将不是最终的。

于 2009-09-14T16:04:05.207 回答