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"),并且可以被子类重写。
第一个函数在声明它的类中可能有实现,也可能没有实现,必须由子类实现