如何在C ++中调用抽象基类的函数?

时间:2011-07-08 12:05:18

标签: c++ visual-c++ exchange-server volume-shadow-service

我正在使用VSS API并使用这个抽象基类CVSSWriter。我想调用它的函数,但我无法创建它的对象。我应该如何继承它,因为它是在VSWriter.h中定义的类 以下是有关其方法的信息的链接 http://msdn.microsoft.com/en-us/library/aa381524%28v=VS.85%29.aspx

我被困住了,请帮助。

我尝试了这个,但它不起作用。

class SPCVssWriterEx:public CVssWriter
{
private:
   LONG _cRef;


public:
      SPCVssWriterEx(){}

     ~SPCVssWriterEx(){}

 // callback for prepare snapsot event
 bool STDMETHODCALLTYPE OnPrepareSnapshot()
     {
      return true;
     }


 // callback for freeze event
 bool STDMETHODCALLTYPE OnFreeze()
     {
       return true;
     }


 // callback for thaw event
 bool STDMETHODCALLTYPE OnThaw()
     {
       return true;
     }

// callback if current sequence is aborted
 bool STDMETHODCALLTYPE OnAbort()
    {
      return true;
    }

};

这四个是纯虚函数,也有一些虚函数。

该课程的实施是

    class CVssWriter
   {
     // Constants
     public:

   // Constructors & Destructors
    public:
__declspec(dllexport)
STDMETHODCALLTYPE CVssWriter();

__declspec(dllexport)
virtual STDMETHODCALLTYPE ~CVssWriter();

    // Exposed operations
    public:
// initialize the writer object
__declspec(dllexport)
HRESULT STDMETHODCALLTYPE Initialize
    (
    IN VSS_ID WriterID,
    IN LPCWSTR wszWriterName,
    IN VSS_USAGE_TYPE ut,
    IN VSS_SOURCE_TYPE st,
    IN VSS_APPLICATION_LEVEL nLevel = VSS_APP_FRONT_END,
    IN DWORD dwTimeoutFreeze = 60000,           // Maximum milliseconds between Freeze/Thaw
    IN VSS_ALTERNATE_WRITER_STATE aws = VSS_AWS_NO_ALTERNATE_WRITER,
    IN bool bIOThrottlingOnly = false,
    IN LPCWSTR wszWriterInstanceName = NULL
    );

// cause the writer to subscribe to events.
__declspec(dllexport)
HRESULT STDMETHODCALLTYPE Subscribe
    (
    IN DWORD dwEventFlags = VSS_SM_BACKUP_EVENTS_FLAG | VSS_SM_RESTORE_EVENTS_FLAG
    );

// cause the writer to unsubscribe from events
__declspec(dllexport)
HRESULT STDMETHODCALLTYPE Unsubscribe();

    // installs an alternative writer
   __declspec(dllexport)
    HRESULT STDMETHODCALLTYPE InstallAlternateWriter
    (
    IN VSS_ID writerId,
    IN CLSID persistentWriterClassId
    );

// Internal properties - accessible from OnXXX methods
    protected:

// get array of volume names
__declspec(dllexport)
LPCWSTR* STDMETHODCALLTYPE GetCurrentVolumeArray() const;

// get count of volume names in array
__declspec(dllexport)
UINT STDMETHODCALLTYPE GetCurrentVolumeCount() const;

// get the name of the snapshot device corresponding to a given volume.
__declspec(dllexport)
HRESULT STDMETHODCALLTYPE GetSnapshotDeviceName
  (
  IN LPCWSTR wszOriginalVolume,
  OUT LPCWSTR* ppwszSnapshotDevice
  ) const;

// current snapshot set GUID
__declspec(dllexport)
VSS_ID STDMETHODCALLTYPE GetCurrentSnapshotSetId() const;

// Current backup context.  
__declspec(dllexport)
LONG STDMETHODCALLTYPE GetContext() const;

// current app level (either 1,2,3)
__declspec(dllexport)
VSS_APPLICATION_LEVEL STDMETHODCALLTYPE GetCurrentLevel() const;

// determine if path is in set of volumes being snapshotted
__declspec(dllexport)
bool STDMETHODCALLTYPE IsPathAffected
    (
    IN LPCWSTR wszPath
    ) const;

// does the backup include bootable state (formerly system state backup)
__declspec(dllexport)
bool STDMETHODCALLTYPE IsBootableSystemStateBackedUp() const;

// is the backup application smart (i.e., selecting components) or
// dump (i.e., just selecting volumes)
__declspec(dllexport)
bool STDMETHODCALLTYPE AreComponentsSelected() const;

__declspec(dllexport)
VSS_BACKUP_TYPE STDMETHODCALLTYPE GetBackupType() const;

__declspec(dllexport)
VSS_RESTORE_TYPE STDMETHODCALLTYPE GetRestoreType() const;

__declspec(dllexport)
bool STDMETHODCALLTYPE IsPartialFileSupportEnabled() const;

_declspec(dllexport)
    HRESULT STDMETHODCALLTYPE SetWriterFailure(HRESULT hr);

    // Ovverides
    public:
// callback when request for metadata comes in
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnIdentify(IN IVssCreateWriterMetadata *pMetadata);

// callback for prepare backup event
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnPrepareBackup(
    IN IVssWriterComponents *pComponent
    );

// callback for prepare snapsot event
virtual bool STDMETHODCALLTYPE OnPrepareSnapshot() = 0;

// callback for freeze event
virtual bool STDMETHODCALLTYPE OnFreeze() = 0;

// callback for thaw event
virtual bool STDMETHODCALLTYPE OnThaw() = 0;

// callback if current sequence is aborted
virtual bool STDMETHODCALLTYPE OnAbort() = 0;

// callback on backup complete event
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnBackupComplete
    (
    IN IVssWriterComponents *pComponent
    );

// callback indicating that the backup process has either completed or has shut down
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnBackupShutdown
    (
    IN VSS_ID SnapshotSetId
    );

// callback on pre-restore event
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnPreRestore
    (
    IN IVssWriterComponents *pComponent
    );

// callback on post-restore event
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnPostRestore
    (
    IN IVssWriterComponents *pComponent
    );

// callback on post snapshot event
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnPostSnapshot
    (
    IN IVssWriterComponents *pComponent
    );

// callback on back off I/O volume event
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnBackOffIOOnVolume
    (
    IN VSS_PWSZ wszVolumeName,
    IN VSS_ID snapshotId,
    IN VSS_ID providerId
    );

// callback on Continue I/O on volume event
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnContinueIOOnVolume
    (
    IN VSS_PWSZ wszVolumeName,
    IN VSS_ID snapshotId,
    IN VSS_ID providerId
    );

// callback to specify that the volume snaphost service is shutting down.  Used
// by alternative writers to signal when to shutdown.
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnVSSShutdown();

// callback to an alternative writer when the application writer subscribes.  Used to
// signal the alternative writer to shutdown.
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnVSSApplicationStartup();

private:

IVssWriterImpl *m_pWrapper;
};

1 个答案:

答案 0 :(得分:2)

抽象类不可实例化,并且在大多数情况下,它们用于定义稍后在其他类中实现的接口。当你说你想要调用抽象类的函数时,你可能想要在从该抽象类继承的具体类型上调用这些函数。

作为示例,请考虑您有一个GeometricFigure抽象类,它提供了area虚函数。您不希望获得抽象图的area,而是获得具体图形的area(比如Triangle)。抽象类为您提供了一种以统一的方式引用不同数字并在这些对象上调用方法的方法,但是您没有在 abstract 图上调用方法,而是在调用方法中具体的对象。