将函数声明设置为0是什么意思?如何将整数分配给函数? (注:这里的“设置函数声明等于0”指的是在类中将函数声明为纯虚函数,即使用“= 0”语法。)

74

我正在浏览一个(不愿透露名称的)GUI工具包的源代码,它封装了Windows API,当我在窗口类中发现以下函数定义时:

 virtual LRESULT CALLBACK wndProc (HWND, UINT, WPARAM, LPARAM) = 0;

这里发生了什么?你如何将函数分配给整数?或者它将其分配给NULL?如果要在wndproc中使用函数指针,是否需要这样做?


2
这是无效的C代码。标签已被删除。 - pmg
2
@pmg,我发现由于它包装了基于C的Win API,所以需要一个C标签。 - ApprenticeHacker
@Cody 谢谢,我之前起了个愚蠢的标题。 - ApprenticeHacker
3
如果你不把它设置为零,它可能会编译通过,但不会成为一个纯虚函数。正如某人在下面所说的,C++不是通过添加语法糖来设置pure virtual,而是要求你将其设置为零。还有人提到,如果你正在使用<Windows.h>,你应该可以使用NULL来代替0,以提高可读性/理解性。 - kayleeFrye_onDeck
3个回答

98
那行代码定义了C++中的一个纯虚函数。它与Win32 API或一般GUI代码无关。
纯虚函数是一种虚函数,当类的设计者想要强制派生类重写函数并提供自己的实现时使用。
如果一个类包含任何纯虚函数,则被认为是一个“抽象”类,该类的实例不能被实例化。
C++使用特殊语法= 0;来表示纯虚函数,而不是像C#等语言添加新的关键字。您可以将其视为将函数指针设置为0。
另请参阅这个相关问题的答案:在C++中使用纯虚函数有什么用途? (顺便说一下,Windows头文件<windows.h>将NULL定义为0。因此程序员理论上可以编写= NULL,但使用数字常量0更清晰,并将NULL保留给指针值。)

我理解。Win API 是如此复杂,有时很难知道它是纯C++还是一些API宏。 - ApprenticeHacker
@burningprodigy:在开始学习Win32 API之前,学习C++(语言)绝对是一个有力的论据。我当时同时学习了它们,但我可能不会向其他人推荐这样做。 :-) 因此我的C++知识明显受到影响。 - Cody Gray

19

这是一个纯虚函数

=0只是表示这是一个纯虚函数的语法。

类中存在纯虚函数会使该类成为抽象类。无法创建任何抽象类的对象,但可以创建指向该抽象类的指针或引用。派生类需要重写该方法。

为什么要将函数设置为纯虚函数?

通常,将函数设置为纯虚函数是为了强制派生类重写该函数并提供自己的实现。值得注意的是,纯虚函数可以拥有自己的实现,因此派生类可以调用基类版本的函数。

有时候,只是为了使基类成为抽象类(从而不能创建其实例),才会添加纯虚函数。在这种情况下,通常将类的析构函数设置为纯虚函数,而不是添加虚函数。


5

这是一个“纯虚函数”,您需要在派生类中重写它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接