C ++中的虚函数实例之间有什么区别?

What's the difference between virtual function instantiations in C++?

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

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

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


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

  • "模板方法"设计模式,其中基类围绕函数调用实现结构,但函数调用的详细信息必须由派生类填写,以及
  • "界面"设计模式,因为C++没有接口关键字。抽象基类,理想地只有纯虚函数和无成员数据,是C++定义接口的方式。

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


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

第二个是虚拟功能(即"正常"虚拟功能)。类提供了此函数的实现,但其派生类可以通过为此方法提供自己的实现来重写此实现。


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

必须在基类中实现第二个类,并且可以在继承的类中实现。


基本上,在继承时,您必须重写第一个,并且允许重写第二个。

来自爪哇,不是吗?


virtual void calculateBase() = 0;

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

virtual void calculateBase();

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


我想你是在混词…

1
virtual void x() = 0;

是纯虚函数或抽象函数。它是一个没有实现的虚拟函数。您讨论的是一个纯抽象类,它是一个接口的C++等价物,关于一个只有抽象函数的类。

1
virtual void x();

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


在爪哇

1
virtual void calculateBase() = 0;

将是

1
abstract void calculateBase();

1
virtual void calculateBase();

将是

1
void calculateBase();

说得很清楚,

1
void calculateBase();

在C++中,是"相同"的

1
final void calculateBase();

在Java中。也就是说,最终是C++中的"缺省"。但是,这个规则有一个例外。当使用虚方法对类进行子类化,并在不使用虚关键字的情况下重新实现它时,子类中的方法将不是最终方法。


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

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