我们可以在实时项目的哪些场景中使用虚拟功能?

时间:2019-06-08 17:27:22

标签: c++ visual-c++

我对虚拟功能概念有很好的了解。并能够创建虚拟函数示例程序并对其进行详细说明。

但是当我看到实时项目时,我对它的实施方式感到困惑。

下面是虚拟函数的实现。而且我对以下实现感到困惑,因为可能是我在这里缺少了一些东西。

任何人都可以解释下面的实现吗?

在基类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())

一旦我看完了上面的代码片段,我心中就会有很多疑问。

  1. 我们仅使用基类对象指针(aControl)调用虚函数。那么在这里使用虚函数概念的必要性是什么?

  2. 在这里,我们使用基类(CUPSControl)的派生类(CUPSControlUSB)。但是没有我没有看到将派生类引用分配给基类指针对象的地方。那么在这里使用虚函数概念的必要性是什么?

先谢谢您

0 个答案:

没有答案