当我在窗口类中find以下函数定义时,我浏览了一个封装Windows API的GUI工具包的源代码(更不用说名称):
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.所以程序员在技术上可以写= NULL
,但使用数字常量0和为指针值保留NULL
更清晰。
这是一个纯粹的虚拟功能 。
=0
只是用来表示它是一个纯虚函数的语法。
纯虚函数在类中的存在使得该类成为Abstract类 。 我们不能创建任何抽象类的对象。 尽管可以创建一个指向这样一个Abstract类的指针或引用。 您的派生类需要重写该方法。
什么是做一个功能纯虚拟的目的?
通常情况下,函数是纯虚拟的,所以Abstract Base类的设计者可以强制派生类来覆盖该函数并提供它自己的实现。 需要注意的是,纯虚函数可以有自己的实现,所以派生类可以调用基类的函数版本。
有时候会添加一个纯虚函数来创建基类Abstract(所以它的实例不能被创建)。 通常,在这种情况下,而不是添加一个虚拟函数来创建一个类。Abstract类的析构函数是纯虚拟的。
这是您需要在派生类中重写的“ 纯虚函数”。