当我在窗口类中找到以下函数定义时,我正在浏览一个(不想命名)GUI Toolkit 的源代码,它封装了 Windows API:
virtual LRESULT CALLBACK wndProc (HWND, UINT, WPARAM, LPARAM) = 0;
这里发生了什么?如何将函数分配给整数?还是将其分配给NULL
? 如果要在 wndproc 中使用函数指针,是否需要这样做?
当我在窗口类中找到以下函数定义时,我正在浏览一个(不想命名)GUI Toolkit 的源代码,它封装了 Windows API:
virtual LRESULT CALLBACK wndProc (HWND, UINT, WPARAM, LPARAM) = 0;
这里发生了什么?如何将函数分配给整数?还是将其分配给NULL
? 如果要在 wndproc 中使用函数指针,是否需要这样做?
那行代码在 C++ 中定义了一个纯虚函数。通常,它与其他棘手的 Win32 API 或 GUI 代码无关。
纯虚函数是当类的设计者想要强制派生类重写该函数并提供自己的实现时使用的虚函数。
如果一个类包含任何纯虚函数,它被认为是一个“抽象”类,并且该类的实例不能被实例化。
C++ 使用特殊语法= 0;
来表示纯虚函数,而不是在语言中添加新关键字(就像 C# 这样的语言所做的那样)。您可以将其视为将函数指针设置为 0。
另请参阅此相关问题的答案:C++ 中纯虚函数的用途是什么?
(顺便说一句,Windows 头文件 < windows.h
> 简单地定义NULL
为 0。所以程序员在技术上可以编写,但使用数字常量 0 并保留指针值= NULL
要清楚得多。)NULL
它是一个纯虚函数。
这=0
只是用于表明它是纯虚函数的语法。
类中存在纯虚函数使该类成为抽象类。不能创建任何抽象类的对象。虽然,可以创建对此类抽象类的指针或引用。您的派生类需要覆盖该方法。
使函数纯虚拟的目的是什么?
通常,一个函数是纯虚拟的,因此抽象基类的设计者可以强制派生类覆盖该函数并提供它自己的实现。需要注意的是,纯虚函数可以有自己的实现,因此派生类可以调用函数的基类版本。
有时添加纯虚函数只是为了使基类抽象(因此无法创建它的实例)。通常,在这种情况下,不是添加虚拟函数来使类抽象,而是将类的析构函数设为纯虚拟。
这是您需要在派生类中重写的“纯虚拟”函数。