我对虚拟功能概念有很好的了解。并能够创建虚拟函数示例程序并对其进行详细说明。
但是当我看到实时项目时,我对它的实施方式感到困惑。
下面是虚拟函数的实现。而且我对以下实现感到困惑,因为可能是我在这里缺少了一些东西。
任何人都可以解释下面的实现吗?
在基类CUPSControl中,“ IsDevicePresent”纯虚函数的实现如下所示:
UPSControl.h
class UPSCONTROL_API CUPSControl{
virtual BOOL IsDevicePresent (VOID) = 0;
};
我们从CUPSControl类派生一个CUPSControlUSB类,如下所示:
UPSControlUSB.h
class CUPSControlUSB : public CUPSControl
{
virtual BOOL IsDevicePresent (VOID);
};
CUPSControlUSB类的IsDevicePresent()实现如下所示:
UPSControlUSB.cpp
BOOL CUPSControlUSB::IsDevicePresent()
{
return theUPSDevice.IsDevicePresent();
}
此处“ theUPSDevice”是类“ CUpsDevice”的对象。 CupsDevice类如下所示:
CUpsDevice类的实现如下所示:
UpsDevice.h
在这里,如果我们看到下面的CUpsDevice类,则它不是从CUPSControlUSB类派生的。但是它使用的是CUPSControlUSB类。
如果我们使用如下所示的CUPSControlUSB类,那是什么意思?
class CUPSControlUSB;
class UPSDEVICE_API CUpsDevice
{
BOOL IsDevicePresent() const;
};
IsDevicePresent()在UpsDevice.cpp中实现,如下所示:
BOOL CUpsDevice::IsDevicePresent() const
{
BOOL result = FALSE;
HDEVINFO DeviceInfoSet;
GUID hidGuid;
HidD_GetHidGuid(&hidGuid);
DeviceInfoSet = SetupDiGetClassDevs(&hidGuid,0,0,DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
if (DeviceInfoSet != INVALID_HANDLE_VALUE)
{
SP_DEVICE_INTERFACE_DATA DeviceInfoData;
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (DWORD index=0; SetupDiEnumDeviceInterfaces(DeviceInfoSet,
0,
&hidGuid,
index,
&DeviceInfoData); index++)
{
DWORD requiredSize = 0;
SetupDiGetDeviceInterfaceDetail(DeviceInfoSet,
&DeviceInfoData,
0,
0,
&requiredSize,
0);
PSP_INTERFACE_DEVICE_DETAIL_DATA detail =
(PSP_INTERFACE_DEVICE_DETAIL_DATA) ::LocalAlloc(LPTR, requiredSize);
if (detail)
{
HANDLE hFile = INVALID_HANDLE_VALUE;
DWORD errCode = 0;
detail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if (SetupDiGetDeviceInterfaceDetail(DeviceInfoSet,
&DeviceInfoData,
detail,
requiredSize,
NULL,
NULL) == TRUE)
{
if (*theDeviceName != _T('\0'))
{
if (_tcscmp(detail->DevicePath, theDeviceName) == 0)
{
result = TRUE;
}
}
}
::LocalFree(detail);
}
}
//Close the DeviceInfoSet
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
}
return result;
}
然后从代码中的某处调用以下语句:
这里aControl是基类CUPSControl的对象
CUPSControl * aControl;
if (aControl->IsDevicePresent())
一旦我看完了上面的代码片段,我心中就会有很多疑问。
我们仅使用基类对象指针(aControl)调用虚函数。那么在这里使用虚函数概念的必要性是什么?
在这里,我们使用基类(CUPSControl)的派生类(CUPSControlUSB)。但是没有我没有看到将派生类引用分配给基类指针对象的地方。那么在这里使用虚函数概念的必要性是什么?
先谢谢您