是什么在C ++虚函数实例之间的区别?(What's the difference betw

2019-08-05 23:59发布

什么是以下两个声明之间的区别?

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

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

Answer 1:

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

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



Answer 2:

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

  • 的“模板方法”设计模式,其中,所述基类实现围绕一个函数调用的结构,但该函数调用的细节必须由派生类填充,和
  • “接口”设计图案,因为C ++不具有接口关键字。 抽象基类,理想地只用纯虚函数和任何成员数据,是定义接口的C ++方法。

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



Answer 3:

第一个没有在基类中实现的,但强制它在继承的类来实现。

你要实现基类中的第二个,它可以在继承类来实现。



Answer 4:

基本上,继承时,你不得不重写的第一个,并允许覆盖第二个。

从Java来了,不是吗?



Answer 5:

我认为你是混合项...

virtual void x() = 0;

是一个纯虚拟函数 ,或抽象的功能。 这是一个没有实现的虚函数。 您谈谈纯抽象类,这是接口的C ++当量,约仅具有抽象函数的类。

virtual void x();

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



Answer 6:

虚拟无效calculateBase()= 0;

第一个功能是纯虚函数里执行不能在课堂上完成,它作为纯粹的抽象类或接口类。 具体的实现应该做或在子类中重写。 它作为接口类的派生类。

虚拟无效calculateBase();

这个函数是虚函数里执行(默认)可以在基类来完成。 但是,派生类必须被重写自己的imeplementation。



Answer 7:

在Java

virtual void calculateBase() = 0;  

将会

abstract void calculateBase();

virtual void calculateBase();

将会

void calculateBase();

要清透,

void calculateBase();

在C ++中,是“相同的”作为

final void calculateBase();

在Java中。 也就是说,最终在C“默认” ++。 有一个例外,但这个规则。 当继承一类具有一个虚拟方法,并且不使用虚拟关键字重新实现它,在子类中的方法将不会被最终。



Answer 8:

第二个功能必须具有在声明它(缺乏“= 0”)的类的实现,并且可以通过子类将覆盖。

第一个功能可以或者没有在声明它的类的实现, 必须由子类实现



文章来源: What's the difference between virtual function instantiations in C++?